回 帖 发 新 帖 刷新版面

主题:问点基础问题,回答重赏

问题一:“段内直接调用指令把返回地址的偏移部分压入堆栈保存”
这句话有点不明白,偏移部分是在哪里得到的?
CALL SUB1   ;这个能看出是段内直接转移?

问题二:段内直接调用和段内间接调用有什么区别?
        段间直接调用和段间间接调用有什么区别?
        麻烦最好写程序让我看看

回复列表 (共6个回复)

沙发

下面是两个代码段和一个数据段
data segment
offaddr  dd  0  ;如果是在8086上,这个是offaddr dw 0,
segaddr dw 0
data ends
code1 segment
....
L1:
  ....
  jmp L1     ;(1)  段内直接         
  jmp L2      ;(2)段间直接
  mov bx,offset L1
  jmp bx      ;(3) 段内间接
  mov offaddr,offset L2
  mov segaddr,seg L2
  jmp fword ptr offaddr ;(4)段间间接
  ......
code1 ends

code2 segment
.......
L2:
  ............
code2 ends
call的原理和上面的大概一样,这不过这个过程由计算机自动完成.

板凳

NEAR省略掉了~
操作数都由(基址:偏移)地址组成
压入的偏移地址也就是下一条IP地址~~~

我也学的比较懵懂....

3 楼

谢谢一楼的朋友
鼓励二楼的朋友
呵呵

4 楼


  一楼chenzep大哥的帖子 非常形象  很适合我们这些菜鸟  谢谢  也要感谢楼主发了这样的帖子  让我也学习了 呵呵

  mov offaddr,offset L2
  mov segaddr,seg L2
  jmp fword ptr offaddr ;(4)段间间接

不过这个段间间接调用 有点不懂  我知道第一句是将L2的偏移量送给offaddr
第2句是将L2的段基址送给segaddr  但第三句就不懂了  希望大家帮我解释下
虽然我不能给你加分 但我会感谢的。

5 楼

段间转移必须要获得目标地址的段地址和偏移地址。
所以,一个段间转移需要的数据为:段地址是2个字节,偏移地址是4个字节(因为计算机是32位的),一共是6字节的数据。
但是,在汇编语言中,没有6字节变量定义。要解决这个问题,就要通过FWORD伪指令来强制转换了。
FWORD就是把当前的变量扩充为6字节。
这就好象C语言中:
int i=0;
char ch = (char)i;
一样概念。
相关的伪指令有DWORD PTR; WORD PTR, BYTE PTR.....

6 楼

谢谢 chenzep大哥 学到东西了

我来回复

您尚未登录,请登录后再回复。点此登录或注册