|
5鱼币
第十章的一个例子程序不能理解"call dword ptr 内存单元",这指令,是远转移,到底压入栈的是下一条指的CS:IP,还是跟"jmp far ptr 内存单元 "指令一样,是将内存地址起始处的两个字中,高字节为CS地址,低字节为偏移地址。看代码:
- assume cs:code
- code segment
- start: mov sp,10h
- mov ax,0123h
- mov ds:[0],ax
- mov word ptr ds:[2],0
- call dword ptr ds:[0]
-
- mov ax,4c00h
- int 21h
- code ends
- end start
复制代码 这段代码在我的win7系统上执行到 mov ds:[0],ax 处就变样了,意思就是不能正确执行,不能如看到如例题所讲的那样在DEBUG中看到相应的结果。书面上给出的结果就是跟 "jmp far ptr 内存单元" 这条指令的执行方式类似,是取数据段起始地址处的两个字,高字节为CS地址,低字节为偏移地址
同时也看迷糊了,call far ptr 标号 ; 这条指令是将下一条地址的CS:IP压入栈中,再跳转到标号处执行。
但是,测试点10.5 中程序代码如下:
- 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
- mov ss:[2],cs
- call dword ptr ss:[0]
- nop
- s:mov ax,offset s
- sub ax,ss:[0ch]
- mov bx,cs
- sub bx,ss:[0eh]
-
- mov ax,4c00h
- int 21h
- code ends
- end start
复制代码 call dword ptr ss:[0] ;这条指令执行的后,却同样是将下一条地址的CS:IP压入栈中。这里跟例子程序又不相附,看到这样头晕眼又花的。又理不通了,请大虾指点迷津啊!谢谢你们。
|
最佳答案
查看完整内容
call 是调用子程序指令,一般和ret指令共同使用,call调用,ret返回,call指令将下一条要执行的指令的地址压入栈内(例子中mov ax,4cooh的地址),然后转到子程序去执行,(即jmp到call指令后面的地址去执行)遇到ret指令时,返回主程序继续执行(弹出mov ax,4c00h的地址给cs:ip),例子中没有ret,不会返回继续执行
|