我正在学习如何创建组装和链接的实模式程序:
我使用的英特尔语法没有使用.intel_syntax noprefix
我想将字符串的地址加载到 SI 寄存器中。我知道,如何引用 NASM 中的内存位置,但是当我在GNU汇编程序代码中执行相同操作时,它只将字符串的WORD移动到寄存器而不是标签的地址。
我的代码是:
.code16
.intel_syntax noprefix
mov cx, 11
mov si, name
mov di, 0x7E00
push di
rep cmpsb
pop di
je LOAD
当我使用GCC编译它时,我可以在调试器中看到处理器执行:
mov si, WORD ptr ds:0x7d2d
但我希望字符串的地址移入寄存器,而不是它指向的数据。
我还尝试在名称旁边加上方括号:
.code16
.intel_syntax noprefix
mov cx, 11
mov si, [name]
mov di, 0x7E00
push di
rep cmpsb
pop di
je LOAD
没有什么区别。
从 NASM 我知道这个汇编代码可以工作:
mov si, name
NASM 将生成将name
的地址移动到寄存器 SI 中的指令。
我的问题:有没有办法强制 GCC 使用带有无前缀的英特尔语法将符号的地址加载到寄存器中?
答案 0 :(得分:7)
如果您使用GNU汇编代码(通过 GCC )和指令:
.intel_syntax noprefix
然后语法似乎有点不寻常,并且在规范来源中没有详细记录。这段代码:
mov si, name
将标记name
指向的内存位置的16位 WORD 移动到 SI 。以下说明执行相同的操作,但我更喜欢方括号[
和]
,因为代码的意图更清晰:
mov si, name
mov si, [name]
mov si, word ptr [name] # This is the same as two above in long form
# The use of "word ptr" here is similar to MASM
要获取name
的地址并将其放入注册表,您需要使用offset
,如下所示:
mov si, offset name
如果有人的规范来源实际上描述了可以与.intel_syntax noprefix
一起使用的语法,请在评论中告诉我。我知道blogs about the syntax,还有一些蔑视,但没有任何正式的。