DSFEF 发表于 2022-3-18 22:55:27

实验10第一问求助

想问一下,小甲鱼在实验10,这个push cx还有push si的作用的什么,我省略了这一步,依然可以正常达到目的,很疑惑,请大家解答一下
下边是代码;push的指令被我注释了

assume cs:code

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


code segment
                start:mov dh,8
                mov dl,3
                mov cl,2
                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
                                mul dh
                                mov bx,ax
                               
                                mov al,2
                                mul dl
                                sub ax,2
                               
                                add bx,ax
                               
                                mov ax,0b800h
                                mov es,ax
                               
                                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

jackz007 发表于 2022-3-18 22:55:28

本帖最后由 jackz007 于 2022-3-20 00:15 编辑

      要看怎么说了,就本例而言,在调用过子程序以后,程序就直接结束了,属于特殊情况,确实没必要在子程序中利用堆栈保护那两个寄存器。
      但是,我们在编写汇编语言子程序(或中断服务程序)的时候,通常应该遵守 "绿色环保" 的原则,就是要确保调用子程序(或中断服务程序)前后,所有的寄存器内容不会发生意外的改变,这就要求在子程序(或中断服务程序)内,对所有需要用到的寄存器必须做到先保存再使用,在退出前进行恢复的原则。本例应该是想这么做,但是,做的不彻底而已。
      
      

jackz007 发表于 2022-3-19 00:45:30

本帖最后由 jackz007 于 2022-3-19 00:48 编辑

      在汇编语言中,push 是数据入栈指令,就是把一个数据先临时保存到堆栈内,等到需要的时候,再通过 pop 指令从堆栈中取出。堆栈操作遵循后进先出的规则,最后入栈的数据最先出栈,使用堆栈必须要注意,入栈(push)与出栈(pop)指令必须成对出现,就是说,必须保持堆栈平衡。
      那么,为什么要使用堆栈呢?因为很多指令例如,mul、div、movsb、lodsb、loop 等操作都会直接影响一部分存储器的数值,而在这个过程中,我们并不希望这些寄存器的数值被改变,这个时候,就可以在执行指令前,先对相关的存储器执行 push 指令,等执行完目标指令后,再 pop 回原来的寄存器就可以了。
assume cs:code
stack segment para stack 'STACK'
    db 400h dup(0)
stack ends
code segment para public 'CODE'
main proc far
       mov ax,10h; ax = 10h
       mov bx,20h; bx = 20h
       mov cx,30h; cx = 30h
       mov dx,40h; dx = 40h
       mov si,50h; si = 50h
       mov di,60h; di = 60h
       push ax   ; 10h 入栈
       push bx   ; 20h 入栈
       push cx   ; 30h 入栈
       push dx   ; 40h 入栈
       push si   ; 50h 入栈
       push di   ; 60h 入栈
       pop ax      ; 60h 出栈,ax = 60h
       pop bx      ; 50h 出栈,bx = 50h
       pop cx      ; 40h 出栈,cx = 40h
       pop dx      ; 30h 出栈,dx = 30h
       pop si      ; 20h 出栈,si = 20h
       pop di      ; 10h 出栈,di = 10h
       mov ax,4c00h
       int 21h
main endp
code ends
end main
      

DSFEF 发表于 2022-3-19 11:13:42

jackz007 发表于 2022-3-19 00:45
在汇编语言中,push 是数据入栈指令,就是把一个数据先临时保存到堆栈内,等到需要的时候,再通过 po ...

我知道,我是说我发的代码似乎没有必要用到push,用了push是不是多此一举了

snrjtg1 发表于 2022-3-21 12:34:52

对,刚开始练手也按最规则来
页: [1]
查看完整版本: 实验10第一问求助