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文件执行并得到奇怪的结果,是因为我在实际代码之前定义了标签?是允许的吗?
谢谢!
答案 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个字节。