xxasy 发表于 2011-7-6 10:16:05

关于监测点10.5第一题的个人理解,第二题不明白的问题。

本帖最后由 xxasy 于 2011-7-7 08:23 编辑


0:|   start: mov ax, stack         
3:|          mov ss,ax            
5:|          mov sp,16      
8:|          mov ds,ax
A:   |          mov ax,0
D:   |          call WORD ptr ds:;
11:|      inc ax
12:|      inc ax
13:|      inc ax
14:|       mov ax,4c00h
             int 21h
codesg ends
end start


这里要注意,call word ptr ds:首先执行的是将ip入栈,也就是将11入栈。然后执行jmp 内存地址ds:处的数据11.这里可以画一个栈图。能看到ip在0E处的数据为11.
用u命令跟踪,ip=11处是第一个inc ax。于是连续执行3个inc ax。因为前面ax被清零。所以执行完后,ax的值为3.我是这样理解的。




assume cs:code

data segment//作为栈
dw 8 dup (0)   
data ends

code segment
start:mov ax,data   
mov ss,ax   //设置栈
mov sp,16   //设置栈指针
mov word ptr ss:,offset s //将栈的【0】位置赋值为 offset s, 也就是段s的起始位置
mov ss:,cs //将栈的【2】位置赋值为 cs
call dword ptr ss:   //有了上面两句,程序通过call就跳转到s执行了,并且,CS,IP入栈
nop   //这里nop占用一个指令位置
s:mov ax,offset s   
sub ax,ss:   //ss:就是IP,也就是nop的位置,显然ax-ip==1,ax为1
mov bx,cs   
sub bx,ss://ss:就是cs ,cs-cs=0,bx为0
code ends   
end start
10.5第二题,有一点我很不解,希望老师能解答。就是设置栈,
mov word ptr ss:[0],offset s
mov ss:,cs
已经赋值了0和2处的值,再执行call,会不会把0和2处的值压下去,放在c到f处?然后再call入栈cs,ip。这两个数值是不是就到了8到d处?求解释、

wangwum 发表于 2011-7-6 16:39:53

wangwum 发表于 2011-7-6 16:40:36

不会发生,如图所示。
页: [1]
查看完整版本: 关于监测点10.5第一题的个人理解,第二题不明白的问题。