彙編初步瞭解筆記

願做無知一猿發表於2020-12-05

彙編筆記

進位制

十六進位制:0 1 2 3 4 5 6 7 8 9 a b c d e f

C和C++以及Java都需要定義資料型別,這是因為計算機底層需要我們給這些資料定義一個資料寬度。

位: 0 1

位元組: 0-0xFF

雙字: 0-0XFFFF

有符號數,無符號數

規則

無符號數規則

1 0 0 1 1 0 1 0

十六進位制:0x9A 十進位制:154

有符號數規則 (最高位是符號位 1 負 ,0 正)

1 0 0 1 1 0 1 0

如何轉換??

原碼,反碼,補碼

原碼: 最高位是符號位,對其它的位進行絕對值即可

反碼:

  • 正數:反碼和原碼相同
  • 負數:符號位一定是1,其餘對原碼取反

補碼:

	舉例   8位
	1   的原碼反碼補碼  正數,原碼反碼補碼都一樣
	原碼:0 0 0 0 0 0 0 1
	反碼:0 0 0 0 0 0 0 1
	補碼:0 0 0 0 0 0 0 1

	-1  的原碼反碼補碼
	原碼:1 0 0 0 0 0 0 1
	反碼:1 1 1 1 1 1 1 0
	補碼:1 1 1 1 1 1 1 1 

	-7  的原碼反碼補碼
	原碼:1 0 0 0 0 1 1 1
	反碼:1 1 1 1 1 0 0 0 
	補碼:1 1 1 1 1 0 0 1

位運算就是基於這些上面的原碼反碼補碼。(在計算機中數字按 補碼 儲存)

暫存器

mov 暫存器 值

位運算

  • 與運算(&):兩個都為 1 則是 1

      例如:
      		1 0 1 1 0 0 0 1 
      		1 1 0 1 1 0 0 0
      		---------------
      		1 0 0 1 0 0 0 0 
    
  • 或運算(|):有一個為 1 則是 1

      例如:
      		1 0 1 1 0 0 0 1 
      		1 1 0 1 1 0 0 0
      		---------------
      		1 1 1 1 1 0 0 1
    
  • 異或運算(xor ^):不一樣就是 1

      例如:
      		1 0 1 1 0 0 0 1 
      		1 1 0 1 1 0 0 0
      		---------------
      		0 1 1 0 1 0 0 1
    
  • 非運算: 0 變 1 ,1 變 0

  • 位運算(移動位)

      例如左移<<(也就是乘2):
      		0 0 0 0 0 0 0 1  
      		0 0 0 0 0 0 1 0 
      		0 0 0 0 0 1 0 0
      		...............
    

左移補0 右移看符號位補

位運算的加減乘除

4 + 5 = ?

	計算機是怎麼操作的??
	0000 0100
	0000 0101 
	---------
	0000 1001

	計算機的實現原理:
		
	第一步: 異或   如果不考慮進位,異或就可以直接出結果。		
	0000 0100
	0000 0101 
	---------
	0000 0001
	
	第二步: 與運算   判斷進位,如果與運算的結果為0,就沒有產生進位
	0000 0100
	0000 0101 
	---------
	0000 0100

	第三步: 將與運算的結果左移一位  得到:0000 1000   這是進位的結果

	第四步: 第一步異或的結果,和第三步進位結果再次異或
	0000 0001
	0000 1000
	---------
	0000 1001
	至此得到4+5的結果。

	第五步:再次將第四步的兩個數進行與運算,判斷是否產生了進位
	0000 0001
	0000 1000
	---------
	0000 0000  沒有產生進位。結果就是上面那個。

4 - 5 = ?

	計算機又是怎麼操作減法的呢? (計算機時不會直接減的!)
	4+(-5)
	
	0000 0100   
	0000 0101    負數轉換: 1111 1010(反碼)-->  1111 1011 (補碼)
	*********

	第一步  異或:
	轉換為 :
	0000 0100
	1111 1011
	---------  
	1111 1111    FF 就是代表-1了,但接著完成下面的步驟

	第二步 與運算	:
	0000 0100
	1111 1011
	---------
	0000 0000   都是0,所以沒有進位,最終結果就是 1111 1111
	
	自己補充一下,因為知道結果是負數,所以還原1111 1111

	符號位不變,補碼-1
	1111 1110
	符號位不變,反碼還原
	1000 0001 
	符號位是1 結果為負數 0000 00001 就是-1

乘法

	說白了就是複雜的加法

除法

	x/y說白了就是減法,就是能減去多少個y,減法又是加法。

組合語言

組合語言是使用一些符號指令表示上面的 異或,與等操作。

暫存器理解

  • 通用暫存器

      儲存資料:CPU > 記憶體 > 硬碟
      
      32位CPU    8 16 32  
       
      64位CPU    8 16 32 64 
      
      32位的通用暫存器只有八個;  每個暫存器存值範圍是 0 - FFFF FFFF
    

    計算機如何向暫存器存值?

    MOV 指令

      mov 存的地址,存得數
      mov 存的地址1,存得地址2	
    

    不同的暫存器

      			FFFF        FF
      32位			16位			8位
      EAX			AX			AL
      ECX			CX			CL
      EDX			DX			DL
      EBX			BX			BL
      ESP			SP			AH
      ENP			NP			CH
      ESI			SI			DH
      EDI			DI			BH
    
      對於8位來說,L代表低8位 ,H代表高8位
    

    除了通用暫存器之外,那麼其他的暫存器每一位都有它特定的作用。

  • 記憶體

    暫存器很小,不夠用,所以需要將資料放到記憶體。

    每個程式程式都有4GB的記憶體空間,類似於空頭支票,並不真的給4GB。

    怎麼算的呢?程式真正執行的時候,才會用到實體記憶體。

    1B = 8bit;

    1KB = 1024B;

    1MB = 1024KB;

    1GB = 1024MB;

    4G的記憶體,4096m => 最終計算為位,就是這個可以儲存的最大容量。

記憶體地址

32位: 定址能力,4GB是上限。

FFFF FFFF + 1 = 1 0000 0000,最大的值

位是怎麼限制記憶體大小的。

1 0000 0000 記憶體地址 * 8  = 位 : 8 0000 0000 

轉換成10進位制/8 : 4,294,967,296位元組

再/1024 :  4,194,304 KB

再/1024 : 4096 MB   也就是4GB,這就說明,32位的定址能力就是4GB。


64位: FFFF FFFF FFFF FFFF   大!!!!

所以每個記憶體地址都有一個編號,,可以通過編號去存值。



記憶體如何存值?
1. 資料寬度   byte word dword
2. 地址的位置 0xFFFFFFFF

彙編如何向記憶體中寫值?

不是任意的地址都可以寫東西,都是申請使用的,也就是說只有程式申請的才可以使用。

mov 資料寬度 記憶體地址,1

mov byte/word/dword/qword ptr ds:[0x19FF70], 1

要注意傳遞的值得資料寬度。

記憶體 有多種寫法

相關文章