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