1. 程式人生 > >記一次8086彙編除錯 關於編寫 7ch 中斷例程輸出字串亂碼

記一次8086彙編除錯 關於編寫 7ch 中斷例程輸出字串亂碼

記一次8086彙編除錯 關於編寫 7ch 中斷例程輸出字串亂碼

輸出welcome to asm

data segment
DB 'welcome to asm ','$'
 data ends

code segment
start:
mov ah,2    ;置游標
    mov bh,0    ;第0頁
    mov dh,12    ;dh中放行號
    mov dl,35   ;dl中放列號
    int 10h

    mov ax,data
    mov ds,ax
    mov dx,0    ;ds:dx指向字串的首地址data:0
    mov ah,9
    int 21h

    mov ax,4c00h
    int 21h 
    code ends
    end start

編寫內中斷輸出welcome to asm

 assume ds:data,cs:code
DATA   SEGMENT
  DB  'welcome to asm!','$'
data ends

code segment
start:       
 mov ax,cs	
 mov ds,ax	
 mov si,offset capital	
 mov ax,0	
 mov es,ax	
 mov di,200h	
 mov cx,offset capitalend - offset capital	
 cld	
 rep movsb	
 mov ax,0	
 mov es,ax	
 mov word ptr es:[7ch*4],200h	
 mov word ptr es:[7ch*4+2],0	
 mov ax,4c00h	
 int 21h
 
 capital:

  mov ah,2    ;置游標
    mov bh,0    ;第0頁
    mov dh,12    ;dh中放行號
    mov dl,35   ;dl中放列號
    int 10h

    mov ax,data
    mov ds,ax
    mov dx,0   ;ds:dx指向字串的首地址data:0
    mov ah,9
    int 21h

    mov ax,4c00h
    int 21h 
iret
capitalend:nop
  code ends
  end start
 

輸出如圖 前者能正常輸出 後者亂碼。輸出如圖 前者能正常輸出 後者亂碼。

在這裡插入圖片描述

在這裡插入圖片描述

對著debug的黑框框調了一整晚後
終於發現了問題
呼叫編寫的7ch內中斷後 賦給ax的data的段地址並不是data的真正段地址
裡面的內容自然也不是我們想要輸出的字串
內中斷會影響到安裝程式之前的data段地址。
把data段放到內中斷後就行了

如圖

在這裡插入圖片描述