当前位置: 代码迷 >> 汇编语言 >> 新人求教,该如何解决
  详细解决方案

新人求教,该如何解决

热度:198   发布时间:2016-05-02 04:49:11.0
新人求教
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

------解决方案--------------------
  相关解决方案