通用暫存器可用於傳送和暫存資料,也可參與算術邏輯運算,並儲存運算結果。除此之外,它們還各自具有一些特殊功能。
組合語言程式設計師必須熟悉每個暫存器的一般用途和特殊用途,只有這樣,才能在程式中做到正確、合理地使用它們。
暫存器主要用途
編號儲存資料的範圍
eax累加器
00 - 0xffffffff
ecx計數
10 - 0xffffffff
edxi/o指標
20 - 0xffffffff
ebxds段的資料指標
30 - 0xffffffff
esp堆疊指標
40 - 0xffffffff
ebpss段的資料指標
50 - 0xffffffff
esi字串操作的源指標;ss段的資料指標
60 - 0xffffffff
edi字串操作的目標指標;es段的資料指標
70 - 0xffffffff
暫存器編號(二進位制)
編號(十進位制)
32位8位
eaxal
0ecxcl1
edxdl
10ebx
bl11
espah
100ebp
ch101
esidh
110edi
bh111
mov 的語法:mov 目標運算元,源運算元 作用將:源拷貝到目的
mov r/m8,r8
mov r/m16,r16
mov r/m32,r32
mov r8,r/m8
mov r16,r/m16
mov r32,r/m32
mov r8, imm8
mov r16, imm16
mov r32, imm32
add 的語法:add 目標運算元,源運算元 作用:將源運算元加到目標運算元上
add r/m8, imm8
add r/m16,imm16
add r/m32,imm32
add r/m16, imm8
add r/m32, imm8
add r/m8, r8
add r/m16, r16
add r/m32, r32
add r8, r/m8
add r16, r/m16
add r32, r/m32
sub 的語法:
例如 sub eax ,ebx;
eax = eax-ebx
sub 目標運算元,源運算元
作用:將源運算元減到目標運算元上
sub r/m8, imm8
sub r/m16,imm16
sub r/m32,imm32
sub r/m16, imm8
sub r/m32, imm8
sub r/m8, r8
sub r/m16, r16
sub r/m32, r32
sub r8, r/m8
sub r16, r/m16
sub r32, r/m32
or 的語法:
or 目標運算元,源運算元
作用:將源運算元與目標運算元或運算後將結果儲存到目標運算元中
or r/m8, imm8
or r/m16,imm16
or r/m32,imm32
or r/m16, imm8
or r/m8, r8
or r/m16, r16
or r/m32, r32
or r8, r/m8
or r16, r/m16
or r32, r/m32
xor 的語法:
xor 目標運算元,源運算元
作用:將源運算元與目標運算元異或運算後將結果儲存到目標運算元中
xor r/m8, imm8
xor r/m16,imm16
xor r/m32,imm32
xor r/m16, imm8
xor r/m8, r8
xor r/m32, r32
xor r8, r/m8
xor r16, r/m16
xor r32, r/m32
取反 0變1 1變0
lea:load effective address,即裝入有效位址的意思,它的運算元就是位址
lea r32,dword ptr ds:[記憶體編號(位址)]
將記憶體位址賦值給32位通用暫存器
lea是傳址,mov是傳值,注意區別
記憶體(memory)是計算機的重要部件之一,也稱記憶體儲器和主儲存器,它用於暫時存放cpu中的運算資料,與硬碟等外部儲存器交換的資料。它是外存與cpu進行溝通的橋梁,計算機中所有程式的執行都在記憶體中進行,記憶體效能的強弱影響計算機整體發揮的水平。只要計算機開始執行,作業系統就會把需要運算的資料從記憶體調到cpu中進行運算,當運算完成,cpu將結果傳送出來。
注意區別我們所說的32位一般都是說的是記憶體位址定址範圍,而不是說暫存器的資料寬度
32位計算機的編號最大是32位,也就是32個1 換成16進製為ffffffff,也就是說,32位計算機記憶體定址的最大範圍是ffffffff+1
記憶體的單位是位元組,那記憶體中能儲存的資訊最多為:ffffffff+1 位元組 即4g,這也是為什麼我們在乙個xp的系統上面如果物理記憶體超過4g是沒有意義的原因
只要是32位的計算機,那麼最多識別的記憶體為4g,對嗎?
不對。可以通過打補丁,或者拓展作業系統來,定址方式是由作業系統決定的
只要是涉及到記憶體讀寫的,一定要指定記憶體的寬度
mov 讀/寫的資料寬度 ptr ds:[位址],***
例:mov eax,dword ptr ds:[0x0012ff34]
dword :要讀/寫多少 此時是32bit (byte 位元組 8bit word字 16bit dword雙字 32bit)
ds:段暫存器 這裡為資料段(後續學習會講段暫存器)
0x0012ff34 記憶體編號,必須是32位的,前面的0可以省略
注意:記憶體編號不要隨便寫,因為記憶體是有保護的,並不是所有的記憶體都可以直接讀寫(需要特別處理)
讀取記憶體的值:
mov eax,dword ptr ds:[0x13ffc4]
mov eax,dword ptr ds:[0x13ffc8]
向記憶體中寫入資料:
mov dword ptr ds:[0x13ffc4],eax
mov dword ptr ds:[0x13ffc8],ebx
獲取記憶體編號:
lea eax,dword ptr ds:[0x13ffc4]
lea eax,dword ptr ds:[esp+8]
reg代表暫存器 可以是8個通用暫存器中的任意乙個
讀取記憶體的值:
mov ecx,0x13ffd0
mov eax,dword ptr ds:[ecx]
向記憶體中寫入資料:
mov edx,0x13ffd8
mov dword ptr ds:[edx],0x87654321
獲取記憶體編號:
lea eax,dword ptr ds:[edx]
讀取記憶體的值:
mov ecx,0x13ffd0
mov eax,dword ptr ds:[ecx+4]
向記憶體中寫入資料:
mov edx,0x13ffd8
mov dword ptr ds:[edx+0xc],0x87654321
獲取記憶體編號:
lea eax,dword ptr ds:[edx+4]
讀取記憶體的值:
mov ecx,0x13ffd0
mov eax,dword ptr ds:[ecx+4]
向記憶體中寫入資料:
mov edx,0x13ffd8
mov dword ptr ds:[edx+0xc],0x87654321
獲取記憶體編號:
lea eax,dword ptr ds:[edx+4]
讀取記憶體的值:
mov eax,13ffc4
mov ecx,2
mov edx,dword ptr ds:[eax+ecx*4+4]
向記憶體中寫入資料:
mov eax,13ffc4
mov ecx,2
mov dword ptr ds:[eax+ecx*4+4],87654321
獲取記憶體編號:
lea eax,dword ptr ds:[eax+ecx*4+2]
暫存器定址方式
指令所要的運算元已儲存在某暫存器中,或把目標運算元存入暫存器。把在指令中指出所使用暫存器 即 暫存器的助憶符 的定址方式稱為暫存器定址方式。指令中可以引用的暫存器及其符號名稱如下 8位暫存器有 ah al bh bl ch cl dh和dl等 16位暫存器有 ax bx cx dx si di sp...
暫存器定址方式
微機系統有七種基本的定址方式 立即定址方式 暫存器定址方式 直接定址方式 暫存器間接定址方式 暫存器相對定址方式 基址加變址定址方式 相對基址加變址定址方式等。其中,後五種定址方式是確定記憶體單元有效位址的五種不同的計算方法,用它們可方便地實現對陣列元素的訪問。立即數定址方式 mov ah,80h ...
通用暫存器和記憶體
計算機在執行時,需要提供資料的容器 容器由記憶體和cpu提供,記憶體提供的容器比較多 cpu提供的容器較少但其中的資料計算速度快 cpu提供的容器就是暫存器,暫存器有特定的資料寬度,決定了該暫存器儲存資料的範圍 1.常用的32位暫存器 32位通用暫存器還可以拆分來使用 將低16位當做16位暫存器 一...