| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
 本帖最后由 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:[0eh];
 
 - 11:  |        inc ax 
 
 - 12:  |        inc ax 
 
 - 13:  |        inc ax 
 
 - 14:  |       mov ax,4c00h 
 
 -              int 21h 
 
 - codesg ends 
 
 - end start
 
  
 
  复制代码 这里要注意,call word ptr ds:[0E]首先执行的是将ip入栈,也就是将11入栈。然后执行jmp 内存地址ds:[oE]处的数据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:[0],offset s //将栈的【0】位置赋值为 offset s, 也就是段s的起始位置
 
 -   mov ss:[2],cs //将栈的【2】位置赋值为 cs
 
 -   call dword ptr ss:[0]   //有了上面两句,程序通过call就跳转到s执行了,并且,CS,IP入栈
 
 -   nop   //这里nop占用一个指令位置
 
 -   s:mov ax,offset s   
 
 -   sub ax,ss:[0ch]   //ss:[0ch]就是IP,也就是nop的位置,显然ax-ip==1,ax为1
 
 -   mov bx,cs   
 
 -   sub bx,ss:[0eh]  //ss:[0eh]就是cs ,cs-cs=0,bx为0
 
 - code ends    
 
 - end start
 
 
  复制代码 10.5第二题,有一点我很不解,希望老师能解答。就是设置栈, 
mov word ptr ss:[0],offset s 
mov ss:[2],cs  
已经赋值了0和2处的值,再执行call,会不会把0和2处的值压下去,放在c到f处?然后再call入栈cs,ip。这两个数值是不是就到了8到d处?求解释、 
 
 |   
 
 
 
 |