assembly - x86 NASM 'org' 指令含义

标签 assembly x86 nasm bootloader

我按照本教程作为第一次尝试使用 NASM 进行 x86 的引导加载程序/操作系统开发:

http://joelgompert.com/OS/TableOfContents.htm

我正在学习第 4 课,这将使我的引导加载程序打印“Hello, world”字符串。 我不明白 org 指令(指令?)的含义。

据我了解,org 定义了正在执行的程序加载到内存中的位置。在程序中使用任何类型的标签或相对地址时都需要这样做。

假设我在程序中定义了一个带有如下标签的字符串:

szHello db 'Hello, world!', 0

然后我尝试像这样引用该标签(仅相关片段):

org 0x7c00
xor ax, ax
mov ds, 0
...
mov si, szHello
lodsb
...
int 0x10 ; Print first character of szHello

我的问题是,为什么这不等于这个? :

org 0
mov ds, 0x7c00
...
mov si, szHello
lodsb
...
int 0x10

当我运行第一个示例时,我的字符串显示正确。第二个例子不起作用。

如果问题是我的概念问题,那么指向相关文档的指针也将不胜感激。

最佳答案

org 定义相关程序期望加载到内存中的位置。不是它实际加载的位置(由加载者控制),而是它期望加载的位置。

关于assembly - x86 NASM 'org' 指令含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8140016/

相关文章:

assembly - 汇编器是如何工作的/它是如何编写的?

assembly - 汇编语言中的寻址模式 (IA-32 NASM)

c++ - 在 x86 32 位的静态类实例中解决这个问题

assembly - x86 汇编操作系统 hello world 未按预期工作

windows - 您如何访问 Windows 命令行参数?

c - 有没有办法知道全局变量和静态变量驻留在数据段(.data + .bss)内的位置?

c - 找出最少 3 个数字的最快方法?

c++ - 如何使用 NASM 创建 .dll 文件?

linux - 在没有 printf 的 NASM 中打印 ARGC

linux - 如何仅编译 ARM32 二进制文件(没有拇指)