汇编关于call指令的有关问题
汇编关于call指令的问题Assembly codeassume cs:codestack segmentdw 8 dup (0)stack endscode segmentsta
汇编关于call指令的问题
Assembly codeassume cs:codestack segment dw 8 dup (0)stack endscode segmentstart: mov ax,stack mov ss,ax mov sp,16 mov ds,ax mov ax,0 call word ptr ds:[0eh] inc ax inc ax inc ax mov ax,4c00h int 21hcode endsend start
为什么我debug时,用t命令到call 指令那句,之后,跳转的地址不是预想的,ax结果也不对,而我用g命令直接跳到mov ax,4c00h那句,ax的结果就是对的
[解决办法]因为debug是使用CPU的自陷(TRAP)功能实现T命令,每执行一条指令后,就进入INT 1h处理,这需要占用当前栈6个字节(FLAGS、IP、CS),虽然debug的INT 1处理过程恢复了程序的寄存器值,但是写到栈空间的内容还在,所以call,ds:[0eh]的值本来应该是0,或者上一次执行call压栈的IP值,但是使用T命令,这地方就被INT 1h用于保存现场了,成了flags寄存器的值。