X86 在代码本身之前在.com文件中定义标签
并将其作为.com文件执行并得到奇怪的结果,是因为我在实际代码之前定义了标签吗?允许吗X86 在代码本身之前在.com文件中定义标签,x86,executable,assembly,X86,Executable,Assembly,并将其作为.com文件执行并得到奇怪的结果,是因为我在实际代码之前定义了标签吗?允许吗 谢谢 我创建.com已经20年了,我可能错了,但我不相信它们是从0x100开始的,那是针对.exe的 因此,如果在0x0000处没有jmp 0x100,您将得到wierd结果 问候, //t与流行的观点相反,org指令没有告诉汇编程序将代码放在哪里。它告诉汇编程序在该点假设指令指针(IP)是什么。许多x86指令使用相对地址,因此汇编程序需要知道代码在段中的偏移量 当DOS加载一个.COM文件时,它会将一个地址
谢谢 我创建.com已经20年了,我可能错了,但我不相信它们是从0x100开始的,那是针对.exe的 因此,如果在0x0000处没有jmp 0x100,您将得到wierd结果 问候,
//t与流行的观点相反,
org
指令没有告诉汇编程序将代码放在哪里。它告诉汇编程序在该点假设指令指针(IP)是什么。许多x86指令使用相对地址,因此汇编程序需要知道代码在段中的偏移量
当DOS加载一个.COM文件时,它会将一个地址放在0000,并将代码加载到0100,这也是它初始化IP的地址
要说明关于组织的观点:
如果你这样做
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
0CD3:0100 E82000 CALL 0123 ; call IP + 20H (IP = 100H + 3)
如您所料,您将接到一个地址为123H的电话:
org 100H
call 123H
但是如果你这样做
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
0CD3:0100 E82000 CALL 0123 ; call IP + 20H (IP = 100H + 3)
然后,当您查看反汇编时,您将看到没有调用0123H,尽管在汇编文本中,call123H
就在您眼前。相反,你会得到
org 105h
call 123h
产生这种差异的原因是,当您编写
org105h
时,实际上您对汇编程序撒了谎,让它假定代码在105H,而实际上DOS将在100H加载代码。这就是为什么在第二个示例中,call指令中的偏移量减少了5个字节。.com文件确实从0x100开始,没有例外。对于入口点地址设置,.exe文件更灵活。他的代码中的问题可能是处理器正在执行POP ES(0x07操作码)、PUSH ES(0x06操作码),然后两个MOV正在从PSP读取值(如果汇编程序在将原点更改为0x100之前从偏移量0开始),而不是预期的7和6。