我在 mac os(x86_64 架構)的程式集方面苦苦掙扎。我想向您介紹一個 hello world 程式的解釋,如果您能給我您的建議和解釋反饋,我將不勝感激:話雖如此,讓我們跳入代碼。
你好世界計劃
以前從未感受過 Hello world 的痛苦。所以,這是我從網上復制粘貼的代碼:global _main
section .text
_main:
mov rax, 0x2000004
mov rdi, 1
mov rsi, str
mov rdi str.len
syscall
mov rax, 0x2000001
xor rdi, rdi
syscall
section .data
str: “Hello world”,
.len: equ $ - str
所以讓我為難自己:
如果我沒記錯的話,全域 _main 基本上告訴聯結器從哪里開始
.text 部分告訴作業系統(我猜)這是實際程式的開始。
_main 如果我沒記錯的話是一個函式,這似乎是函式的表示法
mov rax, 0x2000004 :我不明白這東西是做什么的。我在互聯網上查了一下系統呼叫是如何作業的,它基本上需要一個檔案代碼(我認為這是下一行的 1),一個指向緩沖區的指標(這個緩沖區到底在哪里,我認為指向第一個位元組我的字串)和一段文本的位元組長度(在本例中為 .len)。我的問題是當我需要寫一些東西時,這個十六進制業務是如何作業的,以及 mov rax 指令的實際作業是什么。
mov rdi, 1: 我仍然沒有得到實際發生的事情。我們需要一個 1 來將輸出設定為 stdout,但是這條指令的實際功能是什么,這個 1 去哪里了,幕后發生了什么。
然后我們有這個 str.len ,我不太明白,這個 .len 符號是什么?我知道這給出了字串的大小,但我們怎么能這樣寫呢?
系統呼叫:這個函式看起來像黑魔法,我知道作業系統正在做一些骯臟的把戲,但我對作業系統非常無知,所以我無法理解這件事在做什么。
mov rax, 0x2000001: 現在我們需要退出程式,為什么我們需要將這個十六進制數加載到暫存器中(是的,我知道這是退出的命令,但實際上發生了什么)。
xor rdi, rdi:這可能是我得到的唯一位,我們通過對相同的兩個值進行異或運算,將 rdi 暫存器的內容設定為 0。
系統呼叫:這是黑魔法
str:“Hello World”:我明白了 :)
.len: I do not understand this .notation. I think that $ means “address of here” or at least this is something I looked up, and I think it is correct. As you can see there are many gaps in my understanding and I am sorry if this things can sound trivial to some of you, but I could not really find any kind of book, website, documentation that offers one of those “quickstarts”, “tutorials”, “intros”.I am jumping from one blog to the other and the code seems always to look different :) .
uj5u.com熱心網友回復:
- 不,那只是匯出符號。
- 不,這告訴匯編程式將以下內容放入哪個部分。
.text是代碼的默認部分。 - 不,那是標簽。函式入口點通常用標簽表示,但并非所有標簽都是函式。
- 在 MacOS 上,該值
0x2000004是指定您想要write系統呼叫的代碼。作業系統將查看rax以確定呼叫者想要什么。所有系統服務都有一個代碼。你可以想象作業系統在做類似的事情if (rax == 0x2000004) do_write(rdi, rsi, rdx); rdi是一個暫存器。你知道暫存器,對吧?與上面的第 4 點類似,作業系統一旦確定您想要 awrite就會檢查rdi目標檔案描述符。str.len只是一個標簽語法。該值在底部定義。這應該加載到rdxnotrdi雖然。- 它將控制權轉移給作業系統。然后查看暫存器的內容并執行請求的操作。作業系統只是代碼,盡管有特權。
- 是的,
$是當前位置,也就是字串的結尾。所以減去字串的開頭會給你長度。前導點只是一個特殊的標簽,它指示匯編器使用最近的前一個非本地標簽作為前綴,在本例中為str。所以這相當于寫str.len.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/349315.html
