我是at&t
语法的新手。我使用gcc -S test.c
编译了一个test.c文件。
test.s中的部分文件:
1. .file "test.c"
2. .local temp
3. .comm temp,8,4
4. ...
5. funtion1:
6. blah
7. blah
8. blah
9. movl $temp, -8(%ebp)
我知道-8(%ebp)
是一个本地变量,但不确定$temp
是什么意思
如何在nasm中完成?
我在.bss部分有一个全局临时文件
我能说:mov eax, [ebp-8]
; eax是否包含[ebp-8]的内存地址?mov ebx, temp
; ebx是否包含temp的地址?mov [eax], ebx
;这是否意味着使局部变量指向temp,或者它是否在局部变量中复制了temp?答案 0 :(得分:1)
movl $temp, -8(%ebp)
将temp
的地址写入ebp-8
的本地变量
这可以在nasm中以mov dword [ebp-8], temp
回答您的其他问题:
eax
包含[ebp-8]
处的局部变量的值。要加载地址,您可以使用lea eax, [ebp-8]
temp
的指针,如果eax
保存局部变量的地址(参见第1点)。答案 1 :(得分:0)
要转换为普通的x86语法: 1.从寄存器前面删除%:movl $ LC0,(%esp)=> movl $ LC0,(esp) 2.从常量前面删除$:movl $ LC0,(esp)=> movl LC0,(esp) 3.将()更改为[]:movl LC0,(esp)=> movl LC0,[esp] 4.颠倒操作数的顺序:movl LC0,[esp] => movl [esp],LC0 5.将指令大小后缀转换为前缀:mov [esp],dword LC0。