assembly - "org xxxx"在汇编中有什么用

标签 assembly operating-system x86 boot pc

最近我在学习如何编写引导扇区,这是我正在学习的完整代码:

org 07c00h
    mov ax, cs
    mov ds, ax
    mov es, ax
    call DispStr
    jmp $

DispStr:
    mov ax, BootMessage
    mov bp, ax
    mov cx, 16
    mov ax, 01301h
    mov bx, 000ch
    mov dl, 0
    int 10h
    ret

BootMessage: db "Hello, OS!"
times 510-($-$$) db 0

dw 0xaa55

如果您知道如何启动系统,这是一个非常简单的代码。结果是屏幕上显示一行Hello OS!,唯一不知道的是第一行:org 07c00h,书上告诉我这行代码让编译器把地址定位到7c00h的地方,但是解释是非常模棱两可,我真的不知道这里有什么用。 org 07c00h 行在这里做什么?我试图删除该行,并使用 nasm 创建一个 bin 文件,然后使用 bochs 来启动 bin 文件。与上一个没有什么不同:“你好 OS!”也显示在屏幕上。我可以说第一行在这里什么都不做吗? org xxxx intheworld 有什么用?

最佳答案

它是您一步一步获得汇编器和链接器的地方。组织告诉汇编器,它告诉链接器(在这些情况下通常是同一个程序)在物理内存空间中放置后面的代码。当您使用 C 编译器或其他一些高级语言编译器时,您通常有单独的编译和链接步骤(尽管编译器经常在幕后为您调用链接器)。源代码被编译为位置无关的目标文件,其中一些指令未实现,等待链接步骤。链接器从用户那里获取描述内存空间的对象和链接描述文件或信息,然后从那里编码该内存空间的指令。

User786653 设置得很好,它告诉汇编器一些它自己无法确定这些指令所在的内存空间/地址的信息,以防需要在指令中进行位置相关编码。如果它是包含地址信息的二进制文件,例如 elf、srec、ihex 等,它还会在输出二进制文件中使用该信息。

关于assembly - "org xxxx"在汇编中有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10301467/

相关文章:

assembly - 二元炸弹 - 第 4 阶段

assembly - Assembly 的 Makefile 使用隐式规则而不是显式规则

c - 用于在运行时操作机器代码的库?

assembly - 设计一个指令序列,使其在使用偏移量解码时执行其他操作

c++ - 如何自动并行化堆数组?

c++ - 在 mathops.h 中的 VS2005 汇编代码中的 ffmpeg 编译不编译

c - 使用 read() 将文件内容写入屏幕和 C 中的其他文件的问题

新操作系统的C语言编译器(理论问题)?

c - 运行时值怎么可能是 const?

linux - 一个 C hello world 的汇编输出的每一行是什么意思?