我正在尋找彙編程序在生成機器代碼中使用的簡要說明。彙編器如何工作?
所以我知道程序集是機器碼的1:1翻譯。但是我對目標代碼和鏈接器以及它們如何放置它感到困惑。
我並不需要一個複雜的答案只是一個簡單的人會做的罰款
我正在尋找彙編程序在生成機器代碼中使用的簡要說明。彙編器如何工作?
所以我知道程序集是機器碼的1:1翻譯。但是我對目標代碼和鏈接器以及它們如何放置它感到困惑。
我並不需要一個複雜的答案只是一個簡單的人會做的罰款
既是彙編器和編譯器轉換的源文件到目標文件。
對象文件實際上是最終可執行輸出(由鏈接器生成)之前的中間步驟。
鏈接器獲取指定的對象文件和庫(它們是對象文件的包)並解析重定位(或「修復」)記錄。
當編譯器/彙編程序不知道在源代碼中使用的功能或變量的地址,這些重定位記錄是由,並且通過名稱的引用,其可以由連接器來解決。
例如,假設你想要一個程序打印一條消息到屏幕上,分隔成兩個源文件,並且要seperately組裝它們和(使用Linux系統調用x86-64的例子)將它們鏈接 -
main.asm中:
bits 64
section .text
extern do_message
global _start
_start:
call do_message
mov rax, 1
int 0x80
message.asm:
bits 64
section .text
global do_message
do_message:
mov rdi, message
mov rcx, dword -1
xor rax, rax
repnz scasb
sub rdi, message
mov rax, 4
mov rbx, 1
mov rcx, message
mov rdx, rdi
int 0x80
ret
section .data
message: db "hello world",10,0
如果組裝這些並期待在main.asm中(例如,objdump的-d main.o),此的目標文件的輸出,你會沒有撥打電話do_message有一個地址00 00 00 00 - 這是無效的。
0000000000000000 <_start>:
0: e8 00 00 00 00 callq 5 <_start+0x5>
5: 48 c7 c0 01 00 00 00 mov $0x1,%rax
c: cd 80 int $0x80
但是,重定位記錄的4個字節的地址的製備:
$ objdump -r main.o
main.o: file format elf64-x86-64
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
0000000000000001 R_X86_64_PC32 do_message+0xfffffffffffffffc
000000000000000d R_X86_64_32 .data
該偏移量是「1」和類型是「R_X86_64_PC32」它告訴接頭來解決此參考,並將解析的地址放入指定的偏移量中。
當您將最終程序與'ld -o program main.o message.o'鏈接時,重定位全部解決,如果沒有任何問題未解決,則剩下一個可執行文件。
當我們「objdump的-D」的可執行文件,我們可以看到解析地址:
00000000004000f0 <_start>:
4000f0: e8 0b 00 00 00 callq 400100 <do_message>
4000f5: 48 c7 c0 01 00 00 00 mov $0x1,%rax
4000fc: cd 80 int $0x80
同一種重定位的用於變量和函數。 當您將程序與多個大型庫(例如libc)相連時,會發生同樣的過程 - 您定義了一個名爲'main'的函數,其中libc具有外部引用 - 然後在您的程序之前啓動libc,並調用您的'main'函數當你運行可執行文件時。
asm - > object - > linking ...整齊的小例子。 – 2013-06-21 18:16:50
你能解釋爲什麼在目標文件中的偏移量是1,以及如何計算?對不起,如果這是一個愚蠢的問題。 – gavlaaaaaaaa 2014-01-29 16:23:04
@gavlaaaaaaaa:main.o中do_message重定位引用的偏移量爲1,因爲代碼從0開始,偏移量0是指令'callq'的操作碼'e8',偏移1是下一個32的開始位值是'callq'指令的操作數。 – matja 2014-01-31 12:18:02
簡單的解釋:
一旦彙編語言被組裝成目標代碼,該接頭用於將對象代碼轉換成命令,該計算機可以理解並運行的一個可執行文件。生成的機器碼可以由CPU的控制器解釋。
實際上不一定是1:1 – 2011-05-29 12:15:54