- 论坛徽章:
- 0
|
本帖最后由 landker 于 2013-08-12 14:47 编辑
回复 16# sqfasd - // 文件1:test.asm
- [BITS 32]
- 1) global L0
- 2) extern L1
- [section .data]
- 3) val resb 4
- [section .text]
- 4) L0:
- 5) mov eax, 1
- 6) mov ebx, 2
- 7) add eax, ebx
- 8) ret
- // 文件2:start.asm
- [BITS 32]
- extern L0
- [section .text]
- global _start
- _start:
- ......
- push ebx
- push eax
- call L0
- add esp, 8
-
- ......
复制代码 按照nasm所附带的文档,一般的nasm指令格式如下:
label: instruction operands ; comment
在翻译成机器码的过程中,label(如:L0, _start)会被解释成一个地址。对于上面的程序,第 1 ~ 3 句是伪指令,第 4 ~ 8 句是真正的汇编指令。在用gdb调试时(我用的不太熟练,只是设置了断点和程序反编译显示,即 b _start 和 disassemble L0/_start),发现第 4 ~ 8句是会真正对应机器码的(虽然gdb里没有看到对应的机器码,但是左边的虚拟内存地址在增加),而第 1 ~ 3 句却找不到在哪里(也许是我对gdb不太熟....)。
不过,印象中,伪指令(第1~3)是不会有对应的机器指令的。但这里就会产生一个问题,想请教一下, global/extern(第 1 句和 第 2 句),其真实的作用是什么?(如果删除了这2句,程序无法成功编译/链接)
|
|