在代码本身之前在.com文件中定义标签

时间:2011-02-18 21:11:27

标签: x86 executable assembly

x1 dw 7
x2 dw 6

org 100h
mov ax,[x1] 
mov bx,[x2]
call calc_mod (calcs the modolu)
mov ah,4Ch
int 21h

并将其作为.com文件执行并得到奇怪的结果,是因为我在实际代码之前定义了标签?是允许的吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

20年我建立.com,我可能错了,但不相信他们从0x100开始,那是.exe。

因此,如果没有jmp 0x100在0x0000,你将获得奇怪的结果..

的问候,

//吨

答案 1 :(得分:0)

与流行的看法相反,org指令不会告诉汇编程序 放置代码。它告诉汇编器假设指令指针(IP)在那一点上。许多x86指令使用相对地址,因此汇编程序需要知道段中代码的偏移量。

当DOS加载.COM文件时,它会将program segment prefix置于0000,并将代码加载到0100,这也是它初始化IP的地址。

说明关于组织的观点:

如果你这样做

org  100H
call 123H

您可以按预期致电123H:

0CD3:0100 E82000        CALL    0123   ; call IP + 20H   (IP = 100H + 3)

但如果你这样做

org  105h
call 123h

然后当你看到反汇编时,你会看到你没有接到0123H的电话,尽管在汇编文本中你的眼前有call 123H。相反,你会得到

0CD3:0100 E81B00        CALL    011E   ; call IP + 1BH

出现差异的原因是当你写org 105H时,你基本上骗了汇编程序 - 你告诉它假设代码是105H,而实际上DOS将在100H时加载代码。这就是为什么在第二个例子中,调用指令中的偏移量偏离了5个字节。