Ъγ:_小ツ雨oο 发表于 2014-10-26 18:44:21

汇编10.3监测点

本帖最后由 Ъγ:_小ツ雨oο 于 2014-10-26 18:48 编辑

依据位移进行转移的call、这个AX=6是哪里来的,
还有 call 标号(将当前的ip压栈后,转到标号处执行指令)
为什么要把当前的ip压入栈呢,直接call到标号处不就得了。
还有call执行时,要sp=sp-2,,ss*16+sp=ippush ipcall 标号
这里 sp 为什么要-2.。   
求 详解 call




风之残月 发表于 2014-10-26 18:44:22

本帖最后由 风之残月 于 2014-10-30 21:07 编辑

ax = 6 这里的'6'是栈顶的内容
call 不是将当前的IP压入栈,是将当前指令的下一条指令(inc ax)的IP压入栈中
因为一个栈是以字为单位(视情况而定)进行操作的,并且IP占两个字节(视情况而定),所以 sp 要减 2,为了让 sp 一直指向栈顶

永远健康 发表于 2014-10-27 07:59:26

ax=6是因为单步调试后,中断造成的,书本前面有过实验,中断后会在栈里保存一下数据。把ip压入栈是因为子程序返回cal时可以很方便的用ret指令从栈中找出返回原程序的ip地址。sp=sp-2建议你再看看前面的关于push和pop的栈的章节,是因为用push指令时,会先将sp-2,使栈顶指向下一个单元。因为栈都是以字位单位进行的,所以要减去2.

avatar10010 发表于 2014-10-27 17:08:56

1.pop ax这一句是将栈顶的值(在这里值是6)给了ax
2.call是将下一条命令的ip压入栈,不是将当前ip压入栈,这样做是为了配合ret命令,使call调用过程执行完成后可以继续执行call后面的指令(详见ret指令)
3.调用call后要将ip入栈,而ip占两个字节,当然要把sp的值减少2呀(应为sp始终要指向栈顶)

xx6625303 发表于 2015-2-16 13:08:09

好吧,已经解决了

哥已有用户名 发表于 2015-2-17 22:48:42

不会啊
页: [1]
查看完整版本: 汇编10.3监测点