1.prograCode segment
2.main proc far
3. assume cs:prograCode
4.start:
push ds
6. push ax
mov ch,4
rotate: mov cl,4
rol bx,cl
mov al,bl
and al,0fh
add al,30h
cmp al,3ah
jl next
add al,7h
next:
mov dl,al
mov ah,2
int 21h
dec ch
jnz rotate
ret
main endp
prograCode ends
end
第六行为啥非要需要将ax压入栈中,不压入栈程序执行完毕貌似“乱飞”了,这是为啥呢,求教
栈 push ax寄存器
------解决方案--------------------
程序刚得到运行时,ds 指向程序自身的 psp,ax=0000,这样它是和上一行的 push ds 一起将 psp:0000 压栈;main 子程的最后不是有 ret 指令吗,由于 main 是 far 属性的,所以 ret 即为 retf ,和子程开始压栈的 psp:0000 对应,即这时 retf 会返回到 psp:0000 处,那里有个 int20h 指令,这是个很古老应该被淘汰的“结束程序返回DOS” 的功能调用。现在通常是建议使用下面的代码实现“结束程序返回DOS”
mov ax, 4c00h ; al 可以设置程序的退出码
int 21h
------解决方案--------------------