汇编关于call指令的问题

ps45221 2012-08-29 02:58:05
assume cs:code
stack segment
dw 8 dup (0)
stack ends
code segment
start: 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 21h
code ends
end start

为什么我debug时,用t命令到call 指令那句,之后,跳转的地址不是预想的,ax结果也不对,而我用g命令直接跳到mov ax,4c00h那句,ax的结果就是对的
...全文
183 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
因为debug是使用CPU的自陷(TRAP)功能实现T命令,每执行一条指令后,就进入INT 1h处理,这需要占用当前栈6个字节(FLAGS、IP、CS),虽然debug的INT 1处理过程恢复了程序的寄存器值,但是写到栈空间的内容还在,所以call,ds:[0eh]的值本来应该是0,或者上一次执行call压栈的IP值,但是使用T命令,这地方就被INT 1h用于保存现场了,成了flags寄存器的值。
ps45221 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

两种debug是什么意思?
[/Quote]
一种就是用t命令执行,一种是用g命令直接跳到mov ax,4c00h
  • 打赏
  • 举报
回复
两种debug是什么意思?
ps45221 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

第一次call,ds:[0eh]的值是0,第二次call,ds:[0eh]放的是第一条inc ax指令的地址。
[/Quote]
我想问的是为什么两种debug到call指令后的地址为什么不一样……
  • 打赏
  • 举报
回复
第一次call,ds:[0eh]的值是0,第二次call,ds:[0eh]放的是第一条inc ax指令的地址。
WJN92 2012-08-29
  • 打赏
  • 举报
回复
不明白你的程序,ds:[0eh]是怎么来的呢?
hsfzxjy 2012-08-29
  • 打赏
  • 举报
回复
ds是哪里。。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧