Transcript Chapter 3

第 3 章:組合語言原則
本章概述
•
•
•
•
•
組合語言的基本元素
例子:增加和減去整數
組合,連接,及運行程序
符號常量
實時處理模式編程
2
組合語言的基本元素
•
•
•
•
•
•
•
•
•
整數常數
整數表達式
字符串常數
保留字和標識符
指令和指示
標籤
記憶及運算
評論
例子
3
整數常數
• 任擇領先+ 或 – 符號
• 二進位的,十進位,十六進位或八進數字
• 共同基本符號:
•
•
•
•
h –十六進制
d –十進位
b – 二進位
r – 編碼實數
例子: 30d, 6Ah, 42, 1101b
寫上十六進制開始: 0A5h
4
整數表達式
• 運算優先權 :
• 例子:
5
字符和字符串常數
• 附寄字串單或雙引號
• 'A', "x"
• ASCII 字元 = 1 byte
• 括字符串單或雙引號
• "ABC"
• 'xyz'
• 每個字元佔一個位元組
• 嵌入式引號 :
• ‘說 “晚安," Gracie'
6
保留自和標識符
• 保留字不能夠被使用當做標識符
• 教學記憶法, 指令,類屬性 ,經營者,預定義符號
• 看MASM參考附錄A
• 識別符
• 1-247 字元,包括數字
• 不區分大小寫
• 第一個字元必須寫上一個, _, @, ?, 或 $
7
指令
• 被組合器辨認出而且有所反應的指令
• 不是被設定的英代爾指令的部份
• 過去一直宣布密碼 , 資料區域,選擇記憶模型,
宣布程序, etc.
• 不區分大小寫
• 不同的彙編有不同的指令
• NASM 不相同於MASM,舉例來說
8
指示
•
•
•
•
進入彙編的機器密碼之內組合
在中央處理器的運行時間執行
我們使用的英代爾32位元指令集
一個指令包含:
•
•
•
•
標籤
助憶符號
運算元
註解
(選項)
(需求 )
(仰賴指令)
(選項)
9
標籤
• 擔任地方標記
• 標示位址(位移 )的密碼和資料
• 遵從標識符規則
• 資料標籤
• 一定要很獨特
• 例子: myArray
(不被冒號跟隨)
• 密碼標籤
• 跳躍和環指令的目標
• 例子: L1:
(跟隨冒號)
10
記憶學和運算元
• 教學記憶
• 記憶幫助
• 例子: MOV, ADD, SUB, MUL, INC, DEC
• 運算元
•
•
•
•
常數
常數表達式
暫存器
記憶 (數據標籤)
常數和常數表達時常被叫做
立即價值觀
11
意見
• 意見很好!
•
•
•
•
•
解釋計畫的目的
當這是書面,和誰
校訂資料
絕招編碼技術
申請-特性的解釋
• 單線評論
• 由分號開始(;)
• 多線評論
• 由意見指令和一個程序員選擇的字元開始
• 和相同的程序員選擇的字元結束
12
指令格式例子
• 沒有運算元
• stc
;設定進位旗標
• 一個運算元
• inc eax
;暫存器
• inc myByte
; 記憶
• 兩個運算元
• add ebx,ecx
• sub myByte,25
• add eax,36 * 25
;暫存器,暫存器
; 記憶, 常數
; 暫存器,常數-表達
13
下一章
• 組合語言的基本元素
• 例子:增加和減去整數
•
•
•
•
組譯、連結及執行程式
定義資料
符號常數
實體處理模式規畫
14
例子:增加和減去整數
TITLE Add and Subtract
(AddSub.asm)
;此程式用於對 32 位元的整數進行相加和相減的運算 .
INCLUDE Irvine32.inc
.code
main PROC
mov eax,10000h
add eax,40000h
sub eax,20000h
call DumpRegs
exit
main ENDP
END main
;
;
;
;
EAX = 10000h
EAX = 50000h
EAX = 30000h
display registers
15
例子輸出
規劃輸出,顯示暫存器和旗標
:
EAX=00030000
EBX=7FFDF000
ECX=00000101
EDX=FFFFFFFF
ESI=00000000
EDI=00000000
EBP=0012FFF0
ESP=0012FFC4
EIP=00401024
EFL=00000206
CF=0
SF=0
ZF=0
OF=0
16
建議把標準編碼(1 of 2)
• 對資本化的一些方法
• 資本化沒什麼
• 資本化每件事物
• 資本化所有的保留字字,包括指令記憶法的和暫存器
名字
• 只以資本化指令和經營者
• 其他的建議
• 描述的標識符名字
• 隔開周圍的算術經營者
• 在程序之間留空白線
17
建議把標準編碼(2 of 2)
• 壓痕和間距
•
•
•
•
密碼和資料標籤-沒有壓痕
可執行的指令-縮排 4-5 空間
註解:在專欄 40-45 的開始,垂直地排列
指令和它的運算元之間的 1-3 空間
• ex: mov ax,bx
• 在程序之間的 1-2條空格線
18
需要把標準編碼
• (被教授填寫)
19
AddSub 的替代選擇版本
TITLE Add and Subtract
(AddSubAlt.asm)
;此程式用於對 32 位元的整數進行相加和相減的運算 .
.386
.MODEL flat,stdcall
.STACK 4096
ExitProcess PROTO, dwExitCode:DWORD
DumpRegs PROTO
.code
main PROC
mov eax,10000h
add eax,40000h
sub eax,20000h
call DumpRegs
INVOKE ExitProcess,0
main ENDP
END main
; EAX = 10000h
; EAX = 50000h
; EAX = 30000h
20
Template程式
TITLE Program Template
;
;
;
;
;
Program Description:
Author:
Creation Date:
Revisions:
Date:
Modified by:
(Template.asm)
Instructors: please
customize as needed
INCLUDE Irvine32.inc
.data
; (insert variables here)
.code
main PROC
; (insert executable instructions here)
exit
main ENDP
; (insert additional procedures here)
END main
21
下一章
•
•
•
•
•
•
組合語言的基本元素
例子:增加和減去整數
組譯、連結及執行程式
定義資料
符號常數
實體位址模式程式設計
22
組譯、連結及執行程式
•
•
•
•
組譯-連結-執行周期
製造32.bat
項目表檔案
對映檔
23
組譯-連結執行周期
• 下列的圖表從經過執行被編譯的程式創造一個來源計畫描述步驟.
• 如果原始碼被修正,第2步驟到第4步驟要被重複.
Link
Library
Source
File
Step 1: text editor
Step 2:
assembler
Object
File
Listing
File
Step 3:
linker
Executable
File
Step 4:
OS loader
Output
Map
File
24
項目表檔案
• 使用它見到你的程式如何被編譯
• 包含
•
•
•
•
•
原始碼
位子
目標代碼(機械語言)
部分名稱
符號(變數,程序和常數)
• 例子: addSub.lst
25
對映檔
• 關於每個計畫片段的資訊:
•
•
•
•
出發位址
終止位址
尺寸
片段類型
• 例子: addSub.map (16-bit version)
26
下一章
•
•
•
•
•
•
組合語言的基本元素
例子:增加和減去整數
組譯、連結及執行程式
定義資料
符號常數
實體位址模式程式設計
27
定義資料
•
•
•
•
•
•
•
•
•
•
•
內在的數據類型
資料定義陳述
定義位元組和 SBYTE 資料
定義字和 sword 資料
定義 DWORD 和 SDWORD 資料
定義 QWORD 資料
定義 TBYTE 資料
定義實數資料
小端存取順序
把變數加入 AddSub 程式
宣布設定資料不初值了
28
內在的數據類型(1 of 2)
• BYTE, SBYTE
• 8-bit unsigned integer; 8-bit signed integer
• WORD, SWORD
• 16-bit unsigned & signed integer
• DWORD, SDWORD
• 32-bit unsigned & signed integer
• QWORD
• 64-bit integer
• TBYTE
• 80-bit integer
29
內在的數據類型(2 of 2)
• REAL4
• 4-byte IEEE short real
• REAL8
• 8-byte IEEE long real
• REAL10
• 10-byte IEEE extended real
30
資料定義敘述
• 一份資料定義陳述對於一個變數在記憶設定另外儲藏.
• 可能選擇分配一個名字 (標籤)到資料
• 語法 :
[name] directive initializer [,initializer] . . .
value1 BYTE 10
• All initializers become binary data in memory
31
定義 BYTE 和 SBYTE 資料
每下列各項定義一個儲藏的位元組:
value1 BYTE 'A'
; character constant
value2 BYTE 0
; smallest unsigned byte
value3 BYTE 255
; largest unsigned byte
value4 SBYTE -128
; smallest signed byte
value5 SBYTE +127
; largest signed byte
value6 BYTE ?
; uninitialized byte
• MASM 不阻止你用否定的價值設定一個位元組初值,但是它被考慮
格調低下.
• 如果你宣布一個 SBYTE 變數,微軟偵錯器將自動地在和一個領導
的符號小數中顯示它的價值.
32
定義位元組佈署
使用多初始設定子的例子:
list1 BYTE 10,20,30,40
list2 BYTE 10,20,30,40
BYTE 50,60,70,80
BYTE 81,82,83,84
list3 BYTE ?,32,41h,00100010b
list4 BYTE 0Ah,20h,‘A’,22h
33
定義字串(1 of 3)
• 字串被推行字元當做的排列
• 對於方便,它通常在引號中被附上
• 它時常將是無效力的-結束
• 例子:
str1 BYTE
str2 BYTE
str3 BYTE
greeting
"Enter your name",0
'Error: halting program',0
'A','E','I','O','U'
BYTE "Welcome to the Encryption Demo program "
BYTE "created by Kip Irvine.",0
34
定義字串(2 of 3)
• 繼續線橫過多條線,用一個逗點結束每個線:
menu BYTE "Checking Account",0dh,0ah,0dh,0ah,
"1. Create a new account",0dh,0ah,
"2. Open an existing account",0dh,0ah,
"3. Credit the account",0dh,0ah,
"4. Debit the account",0dh,0ah,
"5. Exit",0ah,0ah,
"Choice> ",0
35
定義字串(3 of 3)
• 結束--線的字元序列:
• 0Dh = carriage return
• 0Ah = line feed
str1 BYTE "Enter your name:
",0Dh,0Ah
BYTE "Enter your address: ",0
newLine BYTE 0Dh,0Ah,0
想法:定義被你的計畫使用的所有的字串在相同的
資料的區域分割.
36
使用 DUP 操作者
• 使用 DUP 分派 (創造空間為)列或字串.
• 語法:計數器 DUP (引數)
• 計數器和引數一定是常數或常數表達
var1 BYTE 20 DUP(0)
; 20 bytes, all equal to zero
var2 BYTE 20 DUP(?)
; 20 bytes, uninitialized
var3 BYTE 4 DUP("STACK")
; 20 bytes: "STACKSTACKSTACKSTACK"
var4 BYTE 10,3 DUP(0),20
; 5 bytes
37
定義word和sword資料
• 為 16 位元整數定義儲藏
• 或兩倍的字元
• 單值或多值
word1
word2
word3
word4
myList
array
WORD
SWORD
WORD
WORD
WORD
WORD
65535
–32768
?
"AB"
1,2,3,4,5
5 DUP(?)
;
;
;
;
;
;
largest unsigned value
smallest signed value
uninitialized, unsigned
double characters
array of words
uninitialized array
38
定義 DWORD 和 SDWORD 資料
儲藏定義為簽署和未被簽署的 32 位元整數:
val1
val2
val3
val4
DWORD
SDWORD
DWORD
SDWORD
12345678h
–2147483648
20 DUP(?)
–3,–2,–1,0,1
;
;
;
;
unsigned
signed
unsigned array
signed array
39
定義 QWORD , TBYTE ,真正的資料
為 quadwords 的儲藏定義, tenbyte 評價,和實數:
quad1 QWORD 1234567812345678h
val1 TBYTE 1000000000123456789Ah
rVal1 REAL4 -2.1
rVal2 REAL8 3.2E-260
rVal3 REAL10 4.6E+4096
ShortArray REAL4 20 DUP(0.0)
40
小端存取順序
• 比一個位元組大的所有的資料類型儲存相反的他們的個別
位元組命令。最沒有重要的位元組在第一 (最低的)記
憶位址發生.
• 例子:
val1 DWORD 12345678h
41
加入變數到AddSub程式
TITLE Add and Subtract, Version 2
(AddSub2.asm)
; This program adds and subtracts 32-bit unsigned
; integers and stores the sum in a variable.
INCLUDE Irvine32.inc
.data
val1 DWORD 10000h
val2 DWORD 40000h
val3 DWORD 20000h
finalVal DWORD ?
.code
main PROC
mov eax,val1
; start with 10000h
add eax,val2
; add 40000h
sub eax,val3
; subtract 20000h
mov finalVal,eax
; store the result (30000h)
call DumpRegs
; display the registers
exit
main ENDP
END main
42
宣布 Unitialized 資料
• 使用那.資料?指導的宣布一個 unintialized 資料片段:
.資料?
• 在片段裡面,宣布變數由於"?“
• 初始設定子 :
smallArray DWORD 10 DUP(?)
優點:計畫的 EXE 檔案大小被減少.
43
下一章
•
•
•
•
•
•
組合語言的基本元素
例子:增加和減去整數
組譯、連結及執行程式
定義資料
符號常數
實體位址模式程式設計
44
符號常數
•
•
•
•
等號指引
計算陣列和字串的大小
EQU 指令
TEXTEQU 指令
45
等號指令
• 名稱=表達
• 表達是一個 32 位元整數(表達或常數)
• 可能被重新定義
• 名稱叫做一個符號常數
• 好程式設計使用符號
COUNT = 500
.
.
mov al,COUNT
46
計算一個位元組的大小陣列
• 現行位置計數器 : $
• 減去目錄的位址
• 不同是位元組的數字
list BYTE 10,20,30,40
ListSize = ($ - list)
47
計算字的大小陣列
分開2位元組的總數 (字的大小)
list WORD 1000h,2000h,3000h,4000h
ListSize = ($ - list) / 2
48
計算 Doubleword 的大小陣列
分開4位元組的總數 (doubleword 的大小)
list DWORD 1,2,3,4
ListSize = ($ - list) / 4
49
EQU 指令
• 定義一個符號當做一個整數或本文表達.
• 不能夠被重新定義
PI EQU <3.1416>
pressKey EQU <"Press any key to continue...",0>
.data
prompt BYTE pressKey
50
TEXTEQU 指令
• 定義一個符號當做一個整數或文字表達.
• 呼叫了一個文字巨集
• 能被重新定義
continueMsg TEXTEQU <"Do you wish to continue (Y/N)?">
rowSize = 5
.data
prompt1 BYTE continueMsg
count TEXTEQU %(rowSize * 2)
; evaluates the expression
setupAL TEXTEQU <mov al,count>
.code
setupAL
; generates: "mov al,10"
51
下一個是什麼
•
•
•
•
•
•
組合語言的基本元素
例子:增加和減去整數
組譯、連結及執行程式
定義資料
符號常數
實體位址模式程式設計
52
實體位址模式程式設計(1 of 2)
• 產生 16 位元 MS-DOS 計畫
• 優點
• 准許 MS-DOS 和 BIOS 功能的呼叫
• 沒有記憶取得限制
• 缺點
• 一定要知道區段和補償
• 不能夠呼叫 Win32 功能(視窗 95 onward)
• 有限的對 640K 程式記憶
53
實體位址模式程式設計(2 of 2)
• 需求
• 包括 Irvine16. inc
• 設定對資料區段的 DS 初值:
mov ax,@data
mov ds,ax
54
增加和減去, 16 位元版本
TITLE Add and Subtract, Version 2
(AddSub2r.asm)
INCLUDE Irvine16.inc
.data
val1 DWORD 10000h
val2 DWORD 40000h
val3 DWORD 20000h
finalVal DWORD ?
.code
main PROC
mov ax,@data
; initialize DS
mov ds,ax
mov eax,val1
; get first value
add eax,val2
; add second value
sub eax,val3
; subtract third value
mov finalVal,eax
; store the result
call DumpRegs
; display registers
exit
main ENDP
END main
55
摘要
•
•
•
•
•
•
整數表達,字元常數
指令的-藉著組合器解釋
指令-在執行時間執行
編碼,資料 , 和堆疊區段
來源,列出,目標,映射,可執行的檔案
資料定義指令:
• BYTE, SBYTE, WORD, SWORD, DWORD, SDWORD,
QWORD, TBYTE, REAL4, REAL8, and REAL10
• DUP operator, location counter ($)
• 符號常數
• EQU 和 TEXTEQU
56
57