汇编程序中一定要用关键字ORG吗?

问题描述 投票:0回答:1

在某些汇编程序中不需要使用 ORG 指令。在我们的程序中有没有必须使用 ORG 的情况?

ORG 100H

我在哪里需要这个代码?

assembly emu8086 microprocessors
1个回答
0
投票

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程序内存布局的程序。

© www.soinside.com 2019 - 2024. All rights reserved.