主题:问点基础问题,回答重赏
shujujiegou01
[专家分:1070] 发布于 2006-11-27 10:31:00
问题一:“段内直接调用指令把返回地址的偏移部分压入堆栈保存”
这句话有点不明白,偏移部分是在哪里得到的?
CALL SUB1 ;这个能看出是段内直接转移?
问题二:段内直接调用和段内间接调用有什么区别?
段间直接调用和段间间接调用有什么区别?
麻烦最好写程序让我看看
回复列表 (共6个回复)
沙发
chenzep [专家分:3640] 发布于 2006-11-27 13:16:00
下面是两个代码段和一个数据段
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的原理和上面的大概一样,这不过这个过程由计算机自动完成.
板凳
JANELAVA [专家分:20] 发布于 2006-11-27 13:24:00
NEAR省略掉了~
操作数都由(基址:偏移)地址组成
压入的偏移地址也就是下一条IP地址~~~
我也学的比较懵懂....
3 楼
shujujiegou01 [专家分:1070] 发布于 2006-11-27 17:54:00
谢谢一楼的朋友
鼓励二楼的朋友
呵呵
4 楼
风一般的女孩 [专家分:50] 发布于 2006-11-27 18:57:00
一楼chenzep大哥的帖子 非常形象 很适合我们这些菜鸟 谢谢 也要感谢楼主发了这样的帖子 让我也学习了 呵呵
mov offaddr,offset L2
mov segaddr,seg L2
jmp fword ptr offaddr ;(4)段间间接
不过这个段间间接调用 有点不懂 我知道第一句是将L2的偏移量送给offaddr
第2句是将L2的段基址送给segaddr 但第三句就不懂了 希望大家帮我解释下
虽然我不能给你加分 但我会感谢的。
5 楼
chenzep [专家分:3640] 发布于 2006-11-27 21:59:00
段间转移必须要获得目标地址的段地址和偏移地址。
所以,一个段间转移需要的数据为:段地址是2个字节,偏移地址是4个字节(因为计算机是32位的),一共是6字节的数据。
但是,在汇编语言中,没有6字节变量定义。要解决这个问题,就要通过FWORD伪指令来强制转换了。
FWORD就是把当前的变量扩充为6字节。
这就好象C语言中:
int i=0;
char ch = (char)i;
一样概念。
相关的伪指令有DWORD PTR; WORD PTR, BYTE PTR.....
6 楼
风一般的女孩 [专家分:50] 发布于 2006-11-29 16:48:00
谢谢 chenzep大哥 学到东西了
我来回复