2017-10-20 27 views
1

最近,我已經開始通過YouTube頻道學習大會,並有一些問題有關聲明中部分的標籤。數據什麼是用於測試數據庫的含義是「世界,你好」在集會爲X86架構的Linux系統上

當我們寫下如下所示的內容:test db「hello world」,是標記「測試」,類似於程序語言中的指針嗎?(這意味着它保存文本「hello world」中第一個元素的內存地址)

當我們寫:mov rsi test,是否意味着我們把「hello world」的地址放入rsi寄存器中?

另一個問題是關於[]的用法,寫[test]的含義是什麼? 這是否意味着像C中的解引用?就像derefernce指針測試,並得到字母「t」,這是「hello world」中的第一個字母?

我將非常感謝任何負責任的我的問題。

+0

爲了一個好的答案,張貼你參考的程序的源代碼將是有用的。 – fuz

+2

'test'是''h''的地址。完整的「hello world」是幾個字節,佔用內存中的幾個地址。順便說一下,海事組織觀看YouTube的東西,比如學習ASM必須比閱讀有關它的好書要慢得多(這可能會解釋所有這一切)。我會對視頻形式的任何asm教程的質量非常懷疑,因爲這種形式不能涵蓋足夠的細節(但可以是一個開始)。 – Ped7g

+0

我認爲這是一個很好的重複目標;它似乎涵蓋了你所要求的。 'test:db「hello world」的C等價物是'char test [] = {'h','e',...,'d'};'(沒有終止零字節)。或者,如果它在'section .rodata'中,那麼'const char test [] = ...'。 –

回答

1

是的,基本上幾乎所有的猜測都是正確的。

標籤和C指針之間的最大區別在於指針實際上是存儲的,並且可以在執行過程中進行修改,但標籤只有彙編程序已知(除非使用全局指令導出到符號表),所以標籤是內存地址,但它是恆定的,不能在執行期間修改。

[]語法經常意味着「數據存儲在」,但它確實影響彙編程序對指令的編碼方式,所以它確實取決於它所使用的指令。例如,lea指令使用[]語法進行地址算術運算,但不訪問結果地址處的內存。但是,如果與移動一起使用,它仍然會對算術進行尋址,但也會訪問存儲在結果地址中的值。

不要把它當作'操作符',把它看作操作數編碼。

+0

'lea'有點像C中的'&'運算符。所以'lea rax,[rdi + rsi]'就像'uint64_t rax =(uint64_t)&rdi [rsi]'。 [這基本上是一種公開CPU硬件的尋址模式解碼能力的方式,用作移位和加法指令](https://stackoverflow.com/a/46597375/224132)。它仍然使用正常尋址模式的機器碼編碼,所以它使用相同的asm語法是有道理的。 –

+0

好的,這就是我想說的。我的觀點是,你不能真正將[]當作解引用運算符,因爲它不是,它用於訪問尋址模式編碼,這不一定是取消引用地址。 – prushik

+0

我猜想我想說它*是*某種deref操作符,但是您可以用''lea''取消它,就像'&''在C中取消''''''或'[]'一樣。我必須同意這是一種令人困惑的方式來看待asm語法! –

相關問題