汇编检测点10.5 (1)
果然大神都不愿意关注这小题。。我自己琢磨出来了!ax=3ss和ds指向同一个地址,里面存放着16个字节的0。
接着当代码执行到call word ptr ds:,会先push下一个地址的ip,即11h,然后word ptr ds:里是存放着00,接着会跳到start处继续执行到call word ptr ds:时,因为ds和ss使用的是栈,所以word ptr ds:里存放着是11h。然后ip就会转到偏移为11h的地址,执行3次inc ax后。
最后得出ax=3. 我知道是把INC AX 的偏移地址 放进栈PUSH 进去的11H 是怎么算出来的,我纠结了下,那个命令占多少个偏移 一直不太明白 为什么是11H然后word ptr ds: 那个里值是什么这里最纠结,,,, 我真的很感悟…… 俺懂了 ,雾过来了。。。管理员删了吧此贴
强烈支持楼主ing…… 有点理解了。一直在纠结这个题目 mumu2218 发表于 2013-5-30 17:39 static/image/common/back.gif
俺懂了 ,雾过来了。。。管理员删了吧此贴
干嘛要删除?留着给后人借鉴。 我怎么觉得ax=4c00h呢,为什么差两句话你们不执行了。 “push下一个地址的ip,即11h,然后word ptr ds:里是存放着00” 这句话怎么那么矛盾呢,既然都把11push进去了,而且就在0eh处,怎么会有00呢,明明就是11h呀? 开始 ds:处存放的是00,但执行到“call word ptr ds:”,首先push ip ,此时的 ip 是值是11h,入栈,因此 ss:的值是11h,而ss栈与数据ds是相关联的,故ds:与ss:值一样是11h,故“call word ptr ds:”命令就是跳转至11h处,即inc ax处,因上面“mov ax,0”,故最终ax=3 call下一条指令的ip为什么是11h?一直没想通 根本不用管ip指向到底是多少,ss和ds都是指向的栈空间,sp又是10H,执行完call指令后,ip指向的是inc ac,把这条指令的偏移地址push进栈中,假设push ip1,此时sp的值是0eH,因为先sp要先-2,说明栈中0eH的位置就是ip1,接下来跳转到ds:处,即栈中存储的偏移地址处,存储的就是ip1,即第一条inc ax的指令的偏移地址,所以是接着下面执行的 瞎说,AX明明最后是4C00H{:5_109:} 看到楼主的帖子瞬间悟了,push ptr ds: 会有3个操作:
1)(sp) = (sp)-2,这时(sp) 的已经变成 0eh
2) 赋值((ss)*16+(sp)) , 值 是指向下一条指令的IP值(即第一个 ‘inc ax' 的偏移地址)
3)jmp到 ((ss)*16+(sp))地址所在的内存单元,又回到了第一条‘inc ax' 指令
ip是ip
sp是sp
这里又没有指名IP是多少,怎么那么牵强附会呢。想象力太强了把
那如何按照你怎么算ip是多少,我来算
mov ax,stack 3个字节
mov ss,ax 2个字节
mov sp,16 3个字节
mov ds,ax 3个字节
mov ax,0 3个字节
call word ptr ds:;最少3个字节 这里算 最少的吧
inc ax 1个字节
那么ip就等于 =15个字节IP = FH
{:5_94:} {:5_91:}
页:
[1]