实验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-20 00:15 编辑
要看怎么说了,就本例而言,在调用过子程序以后,程序就直接结束了,属于特殊情况,确实没必要在子程序中利用堆栈保护那两个寄存器。
但是,我们在编写汇编语言子程序(或中断服务程序)的时候,通常应该遵守 "绿色环保" 的原则,就是要确保调用子程序(或中断服务程序)前后,所有的寄存器内容不会发生意外的改变,这就要求在子程序(或中断服务程序)内,对所有需要用到的寄存器必须做到先保存再使用,在退出前进行恢复的原则。本例应该是想这么做,但是,做的不彻底而已。
本帖最后由 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
jackz007 发表于 2022-3-19 00:45
在汇编语言中,push 是数据入栈指令,就是把一个数据先临时保存到堆栈内,等到需要的时候,再通过 po ...
我知道,我是说我发的代码似乎没有必要用到push,用了push是不是多此一举了
对,刚开始练手也按最规则来
页:
[1]