记一次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
 

输出如图 前者能正常输出 后者乱码。记一次8086汇编调试 关于编写 7ch 中断例程输出字符串乱码_第1张图片

记一次8086汇编调试 关于编写 7ch 中断例程输出字符串乱码_第2张图片

记一次8086汇编调试 关于编写 7ch 中断例程输出字符串乱码_第3张图片

对着debug的黑框框调了一整晚后
终于发现了问题
调用编写的7ch内中断后 赋给ax的data的段地址并不是data的真正段地址
里面的内容自然也不是我们想要输出的字符串
内中断会影响到安装程序之前的data段地址。
把data段放到内中断后就行了

如图

记一次8086汇编调试 关于编写 7ch 中断例程输出字符串乱码_第4张图片

你可能感兴趣的:(记一次8086汇编调试 关于编写 7ch 中断例程输出字符串乱码)