Java学习笔记8-1——汇编语言入门
目錄
- 概述
- 進制運算
- 二進制
- 數據寬度
- 無符號數和有符號數
- 原碼、反碼、補碼
- 位運算
- 位運算實現加減乘除
- 匯編學習環境和必要說明
- 匯編語言
- 通用寄存器
- 內存
- 未完待續
概述
為什么要學習匯編語言
進制運算
運算的本質是查表
二進制
略
為什么要學習理解二進制?
寄存器、內存、位…底層的每一個位都是有含義的。這是匯編入門理解的基礎。
匯編高級則是了解程序的深層和操作系統的內核。
數據寬度
- 計算機內存有限制,數字沒有無窮大(長度),因此要給數字增加數據寬度
bit:1位
Byte:8位
Word:16位
DWord:32位 - C、C++和Java等都需要定義數據的類型。計算機底層需要我們給這些數據定義寬度。
位:0、1
字節:0~0xFF
字:0~0xFFFF
雙字:0~0xFFFFFFFF - 在計算機中,每一個數據需要給它定義類型。給它定義寬度,在內存中的寬度。
無符號數和有符號數
無符號數規則
你這數字是什么,那就是什么(就是一串數字)
有符號數規則
最高位是符號位:負數:1;正數:0
原碼、反碼、補碼
有符號數的編碼規則
原碼:最高位是符號位,其余位表示數值的大小
反碼:
- 正數:反碼和原碼相同
- 負數:符號位一定是1,其余位對原碼取反
補碼:
- 正數:補碼和原碼相同
- 負數:符號位一定是1,反碼+1
如果看到一個二進制的數字,需要了解它是無符號數還是有符號數
位運算
2*8的最高效計算方式?
- 聲明變量、賦值等,位運算比任何方式運算速度都快,比直接寫數字也都快。例如:int a = 1<<4;比int a = 16;快
很多底層的調試器,需要通過位來判斷CPU的狀態
與運算(and &)
全都為1,結果為1。
或運算(or |)
只要有一個1,結果都為1。
異或運算(xor ^)
不一樣就是1。
非運算(單目運算符 not ~)
取反。(單目運算符意為只需一個數字就能完成操作)
通過位運算可以實現加減乘除。
位運算
移動位,左移為×2,右移為÷2
左移:(shl <<)
所有二進制位全部左移若干位,高位丟棄,低位補0
右移:(shr >>)
所有二進制位全部右移若干位,低位丟棄,高位就要補0或1(符號位決定補0還是補1)
位運算實現加減乘除
計算機只認識0和1
基本數學是建立在加減乘除上的,只要搞定加法,其他都能用加法表示。
4 + 5 =?
# 二進制加法: 0000 0100 0000 0101 --------------(計算機不會直接加的) 0000 1001# 計算機實現加法的原理: # 第一步:異或 如果不考慮進位,異或就可以直接出結果。 0000 0100 0000 0101 -------------- 0000 0001# 第二步:與運算 判斷進位,如果與運算結果為0則表示沒有進位 0000 0100 0000 0101 -------------- 0000 0100# 第三步:將與運算的結果左移一位 0000 0100——>0000 1000# 第四步:將上一步的結果跟前面異或的結果再異或 0000 1000 0000 0001 -------------- 0000 1001# 第五步:與運算 判斷進位,如果與運算結果為0則表示沒有進位 0000 1000 0000 0001 -------------- 0000 0000 最終結果就是與運算結果的上一個異或運算的結果。否則繼續重復步驟一到五。4 - 5 =?
即4+(-5) 計算機中的負數用補碼表示 # 二進制減法: 0000 0100 1111 1011 --------------(計算機不會直接減的) 1111 1111 # 第一步:異或 如果不考慮進位,異或就可以直接出結果。 0000 0100 1111 1011 -------------- 1111 1111 # 第二步:與運算 判斷進位,如果與運算結果為0則表示沒有進位 0000 0100 1111 1011 -------------- 0000 0000所以最終結果: 1111 1111乘:x*y,就是y個x相加,還是加法
除:x/y,本質就是減法,就是x能減去多少個y,本質也是加法
計算機只會做加法
機器語言就是位運算。都是電路來實現的,這就是計算機最底層的本質。
對這些數定義一些規則(數據寬度、有符號數和無符號數、原碼反碼補碼這些),規則之上加入位運算,就能表示很多東西。
匯編學習環境和必要說明
匯編語言
即通過指令來代替二進制編碼。
例如上面的復雜的加法操作通過一個ADD指令,使計算機將ADD直接轉換為二進制加法操作的機器語言
在學習匯編之前,需要先掌握環境的配置:
學匯編不是為了寫代碼,是為了理解程序的本質。
建議學習32位的《匯編語言》,至于64位,本質架構區別不大,只是,尋址能力增加。
匯編入門:了解匯編和程序的對應關系,程序的本質即可。
通用寄存器
寄存器:
存儲數據:CPU>內存>硬盤
32位CPU
64位CPU
通用寄存器(可以存儲任意的內容)
32位的通用寄存器只有8個:
EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI
存值的范圍:0~FFFFFFFF
計算機向寄存器存值:
mov指令
不同的寄存器
FFFFFFFF FFFF FF 32位 16位 8位 EAX AX AL ECX CX CL EDX DX DL EBX BX BL ESP SP AH EBP BP CH ESI SI DH EDI DI BH8位 L:低八位 H:高8位除了通用寄存器之外,其他的寄存器每一位都有其特定的功能。比如開機關機啥的。
內存
寄存器很小,不夠用,所以數據要放在內存中。
每個應用程序進程都有4GB的內存空間(但是相當于空頭支票),程序真正運行的時候才會用到物理內存。
1B = 8bit
1KB = 1024B
…
4G的內存(4096M)最終計算為位,就是這個內存可以存儲的最大容量。因此4G內存中的內存地址很多,空間很大。
內存地址
存一個數:占用的大小?數據寬度?存到哪里?
計算機中內存很多,空間很大,每個空間分配一個地址、名字。這些給內存起的編號,就是我們的內存地址。
每個內存地址都有一個編號。可以通過這些編號向里面存值。
內存如何存值?
內存地址有多種寫法:
ds:[0x19FF70+4] 內存地址偏移
ds:[eax] 寄存器
ds:[eax+4] 寄存器偏移
數組[]:
ds:[reg+reg*{1,2,4,8}] 數組
ds:[reg+reg*{1,2,4,8}] 數組偏移
未完待續
總結
以上是生活随笔為你收集整理的Java学习笔记8-1——汇编语言入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Chrome浏览器无法观看视频,一直提示
- 下一篇: 2022秋招面经(C++软开)