1
這裏有一個小NASM程序:撥打GAS equ'd符號
[BITS 64]
[ORG 0x0000000000200000]
b_print_newline equ 0x0000000000100040
start:
call b_print_newline
ret
組裝起來:
$ nasm -f bin pr-nl-a.asm -o pr-nl-a.app
拆解:
$ objdump -D -b binary -m i386:x86-64 pr-nl-a.app
pr-nl-a.app: file format binary
Disassembly of section .data:
0000000000000000 <.data>:
0: e8 3b 00 f0 ff callq 0xfffffffffff00040
5: c3 retq
這裏的氣體版本:
.set b_print_newline , 0x0000000000100040
.text
.global _start
_start:
call b_print_newline
ret
組裝,並將其鏈接:
$ as -o pr-nl-b.o pr-nl-b.s
$ ld -Ttext 200000 --oformat binary -o pr-nl-b.app pr-nl-b.o
拆解:
$ objdump -D -b binary -m i386:x86-64 pr-nl-b.app
pr-nl-b.app: file format binary
Disassembly of section .data:
0000000000000000 <.data>:
0: ff 14 25 40 00 10 00 callq *0x100040
7: c3 retq
正如你所看到的,反彙編代碼略有不同。在NASM的call
代碼:
0: e8 3b 00 f0 ff callq 0xfffffffffff00040
VS氣:
0: ff 14 25 40 00 10 00 callq *0x100040
對如何正確實施GAS版本有什麼建議?
這裏的程序FASM:
b_print_newline equ 0x0000000000100040
use64
org 0x0000000000200000
start: call b_print_newline
ret
它做正確的事:
$ objdump -D -b binary -m i386:x86-64 pr-nl-c.app
pr-nl-c.app: file format binary
Disassembly of section .data:
0000000000000000 <.data>:
0: e8 3b 00 f0 ff callq 0xfffffffffff00040
5: c3 retq
的可能重複的[NASM到GAS:調用equ'd符號](http://stackoverflow.com/questions/6830427/nasm-to-gas-calling-equd-symbols) – ughoavgfhw