在某些汇编程序中不需要使用 ORG 指令。在我们的程序中有没有必须使用 ORG 的情况?
ORG 100H
我在哪里需要这个代码?
ORG
指令有两个不同的目的。它可以在当前生成的输出中重新定位“当前输出地址”,例如:
init_code:
PUSH CS ; tiny memory model, even in EXE file
POP DS
MOV AH,30h
INT 21h ; get dos version
CMP AL, 3
JAE DOS_new_enough
MOV DX, offset error
MOV AH, 9
INT 21h
error db "Needs DOS 3.0 or newer", 13, 10, '$'
new_enough:
; some program code
ORG init_code
var1 dw ?
var2 dw ?
将变量
var1
和var2
覆盖在init_code
上。由于 init_code
在检查 DOS 版本后将不再需要,该内存稍后可以回收用于不同目的。
也可以使用ORG辅助自修改代码,像这样:
MOV [WORD PTR CS:LPT_BASE], 278h ; LPT2
...
MOV AL, [some_data]
MOV DX, 378h
ORG $-2 ; 2 bytes backwards, so the address of the value "220h"
LPT_BASE DW ?
OUT DX, AL
ORG 的这些调用可以用不同的方式重写。
ORG 的另一个目的是告诉链接器输出文件中段部分的目标偏移量。如果没有
ORG
指令,链接器只让命名段的第一个块从偏移量 0 开始,每个后面的块都从前一个块的末尾开始。假设您有两个源文件分别组装然后链接在一起:
DATA SEGMENT
my_data db 180h DUP 0
DATA ENDS
END
和
DATA SEGMENT
my_data2 db 80h DUP 0FFh
DATA ENDS
END
链接器会将
my_data
放在偏移量 0 处,并将 my_data2
放在偏移量 180h 处,因此总数据段大小将为 200h。
现在我们可以将 ORG 指令放入第一个汇编文件中,使其看起来像
DATA SEGMENT
ORG 100h
my_data db 180h DUP 0
DATA ENDS
END
现在,链接器会将偏移量100h分配给my_data,并将偏移量
100h
和280h
之间的空间分配给my_data。 my_data2
将在 280h
分配。总数据段大小仍然是 200h,但它使用偏移量 100h 到 300h,而不是 0 到 200h
另一方面,如果你使用原来的第一个文件,并在第二个文件中添加一个
ORG 100h
指令,my_data
将分配在0,而my_data2
将被强制分配在100h,重叠my_data
. 的最后 80h 字节
使用
ORG
指令,告诉链接器强制放置段块是无法通过其他方式实现的。
ORG
最常见的用法是您在问题中引用的ORG 100h
。您使用该指令告诉汇编器/链接器系统,该文件的内容将加载到运行时段中的偏移量 100h 处。 DOS 中的 COM 程序是这样设置的:前 256 个字节包含操作系统和命令行的管理数据(可以重新用作 128 个字节的数据传输缓冲区),程序代码在它之后开始。所以org 100h
强制工具链构建一个适合COM程序内存布局的程序。