Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
X86 在代码本身之前在.com文件中定义标签_X86_Executable_Assembly - Fatal编程技术网

X86 在代码本身之前在.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文件执行并得到奇怪的结果,是因为我在实际代码之前定义了标签吗?允许吗


谢谢

我创建.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。