315775569 发表于 2012-7-4 21:43:05

关于(汇编49集call 和ret 的指令)里的一个疑问......急....急!!

(1)call word ptr 内存单元地址
例题:
mov sp,10h
mov ax,0123h
mov ds:,ax
call word ptr ds:
执行后 ip=0123h,sp=0eh
为什么sp是这个值呢,sp=10H时,如果栈是空的话,那么sp的值不应该是0ch吗?

(2)call dword ptr 内存单元地址   
例题
mov sp,10h
mov ax,0123h
mov ds:,ax
mov word ptr ds:,0
call dword ptr ds:
执行后 cs=0,ip=0123,sp=0ch
为什么sp是0ch呀!cs,ip各占两个字节 共32位,那么在栈里不是占4个字节吗?怎么会是0ch这个结果呢
很纠结,希望各位大大路过懂得的就帮我解决下吧,我要急着往下学习!先谢谢各位大大了!!!

yuprxk 发表于 2012-7-4 22:11:32

(1)空的时候,指向10H
(2)c,d (IP),, e,f (CS)

315775569 发表于 2012-7-4 22:13:47

错了,PUSH 是往上的,那么第一题SP应该是6H啊,第二题是4H啊,,,,怎么LS的答案会那样,好纠结!

315775569 发表于 2012-7-4 22:20:14

yuprxk 发表于 2012-7-4 22:11 static/image/common/back.gif
(1)空的时候,指向10H
(2)c,d (IP),, e,f (CS)

我想知道的是为什么啊!

水之境界 发表于 2012-7-4 22:33:38

本帖最后由 水之境界 于 2012-7-4 22:36 编辑

(1)
首先,10h不就是16d,0eh不就是14d,栈空时设置sp为16d;
然后,执行call word ptr ds:,相当于先执行一次push ip操作,push sp会-2就变成了0eh了,此时栈里面储存着现在ip的值。   再进行jmp word ptr ds: ,ip 变成0123h

(2)
执行call dword ptr ds:,会进行两次push(入栈)操作,
push CS
push IP
sp的值就会递减两次,每次-2,16d-2d-2d = 12d = 0ch .
d表示十进制
h表示十六进制
楼主加油哦,我也是新手。{:5_108:}

315775569 发表于 2012-7-4 22:45:38

水之境界 发表于 2012-7-4 22:33 static/image/common/back.gif
(1)
首先,10h不就是16d,0eh不就是14d,栈空时设置sp为16d;
然后,执行call word ptr ds:,相当于 ...

{:5_99:}sp一般都是用十六进制表示的,哪里晓得这里是要十进制的,它这里用的是10H, 我以为是11H,12H,13H,这样下去的,晕,都分不清楚了,菜鸟就是菜鸟呢,早知道是这样就不用头疼了,呵呵,谢谢好友的解释!

315775569 发表于 2012-7-4 22:50:33

315775569 发表于 2012-7-4 22:45 static/image/common/back.gif
sp一般都是用十六进制表示的,哪里晓得这里是要十进制的,它这里用的是10H, 我以为是11H,12H,13 ...

加油加油,你还真厉害,新手就理解的那么深透了!

水之境界 发表于 2012-7-5 09:33:44

本帖最后由 水之境界 于 2012-7-5 09:36 编辑

315775569 发表于 2012-7-4 22:45 static/image/common/back.gif
sp一般都是用十六进制表示的,哪里晓得这里是要十进制的,它这里用的是10H, 我以为是11H,12H,13 ...
十六进制是逢十六进1,每位数字从0~9和十进制的0~9一样,A,B,C,D,E,F表示10,11,12,13,14,15。
各种进制原理都是一样的。这里sp的确是十六进制,10h相当于十进制的16。
页: [1]
查看完整版本: 关于(汇编49集call 和ret 的指令)里的一个疑问......急....急!!