[英]What is the difference between Assembly and binary?
我無法理解匯編和二進制之間的區別。 只是我需要了解鏈接二進制文件和程序集之間的關系。
匯編基本上是以人類可以閱讀的形式編寫的二進制代碼。 匯編器然后獲取匯編代碼並將其逐行轉換為相應的位代碼。
想象一下,有一個表格,每個可能的匯編語句都有一行。 然后在每一行左邊是語句本身,右邊是計算機可以理解的相應位
話雖如此,匯編器也有額外的功能,如宏等,但主要功能如上所述。
對於程序員來說,二進制只是一個編號系統。 例如, base2
由一些 0 和 1 組成。 所有計算機都使用這些二進制數(0 和 1)。 他們將指令視為一組這些數字。 他們感覺不到一般使用 Python、Java 等高級編程語言生成的人工生成代碼。
很明顯,計算機中的機器指令並不是人類可讀的——大多數人無法通過查看指令字節的二進制或十六進制表示來弄清楚 100010001... 和 010001000... 之間的操作差異。 這些指令只是機器代碼。
例如,在 x86-16 架構中用於將值加載到寄存器的機器代碼將此指令作為十六進制代碼: 8B 0E 34 12
其中8B
表示mov r16, r/m16
和0E
指定目標是哪個寄存器(在此case CX),以及哪個內存/源寄存器具有 2 位尋址模式字段和 3 位基址寄存器(在這種特定情況下,沒有寄存器,只有 16 位絕對位移)。
PS為了清楚起見,HEX 代碼用於表示機器代碼。 實際上,很容易將其轉換為二進制“10001011000011100011010000010010”,這就是您提到的binary 。 HEX 只是二進制數字的文本序列化格式,如 ASCII 0 和 1 的字符串,但更緊湊。
匯編比機器代碼更高級,並使此類 binray/HEX 指令對人類可讀。 例如,機器碼8B 0E 34 12
將被解碼/反匯編為MOV CX, [1234H]
。
程序集標簽維基開始或多或少地回答了這個問題。 你應該閱讀它。
匯編器將人類可讀的匯編語言組裝成二進制文件的字節。 asm 源可以直接指定字節,以十六進制或其他形式。 在 x86 NASM 語法中,您可以使用db 0x30
語句將該字節組合到當前輸出位置。
您還可以將助記符用於機器指令。 例如, add eax, [rdi + rdx*4]
以要求 Intel 語法 x86 匯編器發出對該指令進行編碼的字節。 匯編器然后找出將該指令編碼為機器代碼的最短(或唯一)方法,並將這些字節放入輸出中。
還有更復雜的情況,例如現代目標文件格式有多個部分(如.text
和.data
),您可以選擇將字節組裝到哪個部分。 因此,您可以將常量保留在使用它們的代碼附近,而無需在最終二進制文件中實際混合代碼和數據。
例如,請參閱此 Godbolt 鏈接。 在右側窗格中,您可以看到二進制文件和相應的 asm 源代碼。
二進制不僅可以用作數字系統來表示“數字”,還可以表示某些對象並用作字符。 以“2”這樣的數字為例,當你看到它是一個數字時,它是數字,你可以添加它,也許某人的id是2,你稱他為2,但你沒有計算它,因為它在事實上是一個字符....
binary 和 assembly 是一對一的匹配,這意味着你在匯編中寫的實際上是二進制的。
例如,在我們進行組裝之前,您要加一加一,您可能需要:
1.load 1 到累加器
2.累加器加1
3.存入地址
但你只能使用 brinary insctrction 來表示......你能做什么? 你唯一能做的就是使用 0 和 1 的組合來表示你需要做的事情。 讓我們想想 0001 表示加載,0010 表示添加,0011 表示存儲,因此您可以編寫如下內容:
0001 000000001
0010 000000001
0011 000000101(000000101 is a location where you store the stuffs in
累加器)
真是一團糟,聰明的你想出了一個好主意,就是用可讀的詞來表示這樣的指令:
0001 -> load
0010 -> add
0011 -> store
所以你可以用匯編寫它......
load 1
add 1
store 5
這是很容易理解的匯編!(當然你可以把數字改成十六進制形式來縮寫~)
你可以看到,當你翻譯它時,0001實際上不是一個數字,00000001是。 所以 0001 只是一個符號,為了更好的閱讀,使用匯編來代替 cahr 類型的符號。 00000001 真的是一個數字,你可以用任何其他形式寫它,但巧合的是十進制是 1,十六進制也是 1:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.