skw 发表于 2014-7-10 11:03:22

关于实验十(1)栈的问题?

data segment
      db 'Welcome to masm!',0
data ends

code segment
      assume cs:code,ds:data
start:
      mov dh,1            ;dh装行号(范围:1--25)
      mov dl,1            ;dl装列号(范围:1--80)[注:每超过80等于行号自动加1]
      mov cl,0cah         ;cl中存放颜色属性(0cah为红底高亮闪烁绿色属性)
      mov ax,data
      mov ds,ax
      mov si,0

      call show_str
      
      mov ax,4c00h
      int 21h
      
show_str:   ;显示字符串的子程序[定义开始]
      push cx
      push si
      mov al,0A0h
      dec dh          ;行号在显存中下标从0开始,所以减1
      mul dh
      mov bx,ax
      mov al,2
      mul dl
      sub ax,2       ;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2
      add bx,ax      ;此时bx中存放的是行与列号的偏移地址
      mov ax,0B800h
      mov es,ax      ;es中存放的是显存的第0页(共0--7页)的起始的段地址
      mov di,0
      mov al,cl
      mov ch,0
s:      mov cl,ds:
      jcxz ok
      mov es:,cl       ;偶地址存放字符
      mov es:,al   ;奇地址存放字符的颜色属性
      inc si
      add di,2
      jmp short s
ok:   pop si
      pop cx
      ret    ;显示字符串的子程序[定义结束]

code ends
end start


这个程序为什么要把cx和si入栈?我把入栈和出栈的指令删了它也可以成功执行啊?请各位前辈指点.谢谢!

catch 发表于 2014-7-10 11:08:06

如果下面用到这两个值的话,可能里面的值会有所改变,导致程序错误,如果你觉得用不到这两个值,最好还是这样写,为了保险起见~

skw 发表于 2014-7-10 11:49:27

catch 发表于 2014-7-10 11:08
如果下面用到这两个值的话,可能里面的值会有所改变,导致程序错误,如果你觉得用不到这两个值,最好还是这样写 ...

谢谢!我明白啦!写程序一定要严谨,尽量控制有可能的错误!:handshake

catch 发表于 2014-7-10 11:50:36

skw 发表于 2014-7-10 11:49
谢谢!我明白啦!写程序一定要严谨,尽量控制有可能的错误!

嗯,是的~{:7_168:}
页: [1]
查看完整版本: 关于实验十(1)栈的问题?