?? 哈哈哈,超酷匯編教程-- 簡明x86匯編語言教程(3).txt
字號:
哈哈哈,超酷匯編教程-- 簡明x86匯編語言教程(3)
--------------------------------------------------------------------------------
司徒彥南 時間:2003-11-29 9:22:29
2.2 使用寄存器
在前一節中的x86基本寄存器的介紹,對于一個匯編語言編程人員來說是不可或缺的。現在你知道,寄存器是處理器內部的一些保存數據的存儲單元。僅僅了解這些是不足以寫出一個可用的匯編語言程序的,但你已經可以大致讀懂一般匯編語言程序了(不必驚訝,因為匯編語言的祝記符和英文單詞非常接近),因為你已經了解了關于基本寄存器的絕大多數知識。
在正式引入第一個匯編語言程序之前,我粗略地介紹一下匯編語言中不同進制整數的表示方法。如果你不了解十進制以外的其他進制,請把鼠標移動到這里。
匯編語言中的整數常量表示
十進制整數
這是匯編器默認的數制。直接用我們熟悉的表示方式表示即可。例如,1234表示十進制的1234。不過,如果你指定了使用其他數制,或者有凡事都進行完整定義的小愛好,也可以寫成[十進制數]d或[十進制數]D的形式。
十六進制數
這是匯編程序中最常用的數制,我個人比較偏愛使用十六進制表示數據,至于為什么,以后我會作說明。十六進制數表示為0[十六進制數]h或0[十六進制數]H,其中,如果十六進制數的第一位是數字,則開頭的0可以省略。例如,7fffh, 0ffffh,等等。
二進制數
這也是一種常用的數制。二進制數表示為[二進制數]b或[二進制數]B。一般程序中用二進制數表示掩碼(mask code)等數據非常的直觀,但需要些很長的數據(4位二進制數相當于一位十六進制數)。例如,1010110b。
八進制數
八進制數現在已經不是很常用了(確實還在用,一個典型的例子是Unix的文件屬性)。八進制數的形式是[八進制數]q、[八進制數]Q、[八進制數]o、[八進制數]O。例如,777Q。
需要說明的是,這些方法是針對宏匯編器(例如,MASM、TASM、NASM)說的,調試器默認使用十六進制表示整數,并且不需要特別的聲明(例如,在調試器中直接用FFFF表示十進制的65535,用10表示十進制的16)。
現在我們來寫一小段匯編程序,修改EAX、EBX、ECX、EDX的數值。
我們假定程序執行之前,寄存器中的數值是全0:
? X
H L
EAX 0000 00 00
EBX 0000 00 00
ECX 0000 00 00
EDX 0000 00 00
正如前面提到的,EAX的高16bit是沒有辦法直接訪問的,而AX對應它的低16bit,AH、AL分別對應AX的高、低8bit。
mov eax, 012345678h
mov ebx, 0abcdeffeh
mov ecx, 1
mov edx, 2 ; 將012345678h送入eax
; 將0abcdeffeh送入ebx
; 將000000001h送入ecx
; 將000000002h送入edx
則執行上述程序段之后,寄存器的內容變為:
? X
H L
EAX 1234 56 78
EBX abcd ef fe
ECX 0000 00 01
EDX 0000 00 02
那么,你已經了解了mov這個指令(mov是move的縮寫)的一種用法。它可以將數送到寄存器中。我們來看看下面的代碼:
mov eax, ebx
mov ecx, edx ; ebx內容送入eax
; edx內容送入ecx
則寄存器內容變為:
? X
H L
EAX abcd ef fe
EBX abcd ef fe
ECX 0000 00 02
EDX 0000 00 02
我們可以看到,“move”之后,數據依然保存在原來的寄存器中。不妨把mov指令理解為“送入”,或“裝入”。
練習題
把寄存器恢復成都為全0的狀態,然后執行下面的代碼:
mov eax, 0a1234h
mov bx, ax
mov ah, bl
mov al, bh ; 將0a1234h送入eax
; 將ax的內容送入bx
; 將bl內容送入ah
; 將bh內容送入al
思考:此時,EAX的內容將是多少?[答案]
下面我們將介紹一些指令。在介紹指令之前,我們約定:
使用Intel文檔中的寄存器表示方式
reg32 32-bit寄存器(表示EAX、EBX等)
reg16 16-bit寄存器(在32位處理器中,這AX、BX等)
reg8 8-bit寄存器(表示AL、BH等)
imm32 32-bit立即數(可以理解為常數)
imm16 16-bit立即數
imm8 8-bit立即數
在寄存器中載入另一寄存器,或立即數的值:
mov reg32, (reg32 | imm8 | imm16 | imm32)
mov reg32, (reg16 | imm8 | imm16)
mov reg8, (reg8 | imm8)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -