TITLE Add and Subtract Add Sub asm 32
例子: 增加和減去整數 TITLE Add and Subtract (Add. Sub. asm) ; 此程式用於對 32 位元的整數進行相加和相減的運算. INCLUDE Irvine 32. inc. code main PROC mov eax, 10000 h add eax, 40000 h sub eax, 20000 h call Dump. Regs exit main ENDP END main ; ; EAX = 10000 h EAX = 50000 h EAX = 30000 h display registers 15
例子輸出 規劃輸出,顯示暫存器和旗標 : EAX=00030000 EBX=7 FFDF 000 ECX=00000101 EDX=FFFF ESI=0000 EDI=0000 EBP=0012 FFF 0 ESP=0012 FFC 4 EIP=00401024 EFL=00000206 CF=0 SF=0 ZF=0 OF=0 16
Add. Sub 的替代選擇版本 TITLE Add and Subtract (Add. Sub. Alt. asm) ; 此程式用於對 32 位元的整數進行相加和相減的運算. . 386. MODEL flat, stdcall. STACK 4096 Exit. Process PROTO, dw. Exit. Code: DWORD Dump. Regs PROTO. code main PROC mov eax, 10000 h add eax, 40000 h sub eax, 20000 h call Dump. Regs INVOKE Exit. Process, 0 main ENDP END main ; EAX = 10000 h ; EAX = 50000 h ; EAX = 30000 h 20
Template程式 TITLE Program Template ; ; ; Program Description: Author: Creation Date: Revisions: Date: Modified by: (Template. asm) Instructors: please customize as needed INCLUDE Irvine 32. inc. data ; (insert variables here). code main PROC ; (insert executable instructions here) exit main ENDP ; (insert additional procedures here) END main 21
內在的數據類型(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) • REAL 4 • 4 -byte IEEE short real • REAL 8 • 8 -byte IEEE long real • REAL 10 • 10 -byte IEEE extended real 30
定義 BYTE 和 SBYTE 資料 每下列各項定義一個儲藏的位元組: value 1 BYTE 'A' ; character constant value 2 BYTE 0 ; smallest unsigned byte value 3 BYTE 255 ; largest unsigned byte value 4 SBYTE -128 ; smallest signed byte value 5 SBYTE +127 ; largest signed byte value 6 BYTE ? ; uninitialized byte • MASM 不阻止你用否定的價值設定一個位元組初值,但是它被考慮 格調低下. • 如果你宣布一個 SBYTE 變數,微軟偵錯器將自動地在和一個領導 的符號小數中顯示它的價值. 32
定義位元組佈署 使用多初始設定子的例子: list 1 BYTE 10, 20, 30, 40 list 2 BYTE 10, 20, 30, 40 BYTE 50, 60, 70, 80 BYTE 81, 82, 83, 84 list 3 BYTE ? , 32, 41 h, 0010 b list 4 BYTE 0 Ah, 20 h, ‘A’, 22 h 33
定義字串(1 of 3) • 字串被推行字元當做的排列 • 對於方便,它通常在引號中被附上 • 它時常將是無效力的-結束 • 例子: str 1 BYTE str 2 BYTE str 3 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", 0 dh, 0 ah, "1. Create a new account", 0 dh, 0 ah, "2. Open an existing account", 0 dh, 0 ah, "3. Credit the account", 0 dh, 0 ah, "4. Debit the account", 0 dh, 0 ah, "5. Exit", 0 ah, "Choice> ", 0 35
定義字串(3 of 3) • 結束--線的字元序列: • 0 Dh = carriage return • 0 Ah = line feed str 1 BYTE "Enter your name: ", 0 Dh, 0 Ah BYTE "Enter your address: ", 0 new. Line BYTE 0 Dh, 0 Ah, 0 想法:定義被你的計畫使用的所有的字串在相同的 資料的區域分割. 36
使用 DUP 操作者 • 使用 DUP 分派 (創造空間為)列或字串. • 語法:計數器 DUP (引數) • 計數器和引數一定是常數或常數表達 var 1 BYTE 20 DUP(0) ; 20 bytes, all equal to zero var 2 BYTE 20 DUP(? ) ; 20 bytes, uninitialized var 3 BYTE 4 DUP("STACK") ; 20 bytes: "STACKSTACK" var 4 BYTE 10, 3 DUP(0), 20 ; 5 bytes 37
定義word和sword資料 • 為 16 位元整數定義儲藏 • 或兩倍的字元 • 單值或多值 word 1 word 2 word 3 word 4 my. List array WORD SWORD 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 位元整數: val 1 val 2 val 3 val 4 DWORD SDWORD 12345678 h – 2147483648 20 DUP(? ) – 3, – 2, – 1, 0, 1 ; ; unsigned array 39
定義 QWORD , TBYTE ,真正的資料 為 quadwords 的儲藏定義, tenbyte 評價,和實數: quad 1 QWORD 12345678 h val 1 TBYTE 100000123456789 Ah r. Val 1 REAL 4 -2. 1 r. Val 2 REAL 8 3. 2 E-260 r. Val 3 REAL 10 4. 6 E+4096 Short. Array REAL 4 20 DUP(0. 0) 40
加入變數到Add. Sub程式 TITLE Add and Subtract, Version 2 (Add. Sub 2. asm) ; This program adds and subtracts 32 -bit unsigned ; integers and stores the sum in a variable. INCLUDE Irvine 32. inc. data val 1 DWORD 10000 h val 2 DWORD 40000 h val 3 DWORD 20000 h final. Val DWORD ? . code main PROC mov eax, val 1 ; start with 10000 h add eax, val 2 ; add 40000 h sub eax, val 3 ; subtract 20000 h mov final. Val, eax ; store the result (30000 h) call Dump. Regs ; display the registers exit main ENDP END main 42
計算字的大小陣列 分開2位元組的總數 (字的大小) list WORD 1000 h, 2000 h, 3000 h, 4000 h List. Size = ($ - list) / 2 48
計算 Doubleword 的大小陣列 分開4位元組的總數 (doubleword 的大小) list DWORD 1, 2, 3, 4 List. Size = ($ - list) / 4 49
EQU 指令 • 定義一個符號當做一個整數或本文表達. • 不能夠被重新定義 PI EQU <3. 1416> press. Key EQU <"Press any key to continue. . . ", 0>. data prompt BYTE press. Key 50
TEXTEQU 指令 • 定義一個符號當做一個整數或文字表達. • 呼叫了一個文字巨集 • 能被重新定義 continue. Msg TEXTEQU <"Do you wish to continue (Y/N)? "> row. Size = 5. data prompt 1 BYTE continue. Msg count TEXTEQU %(row. Size * 2) ; evaluates the expression setup. AL TEXTEQU <mov al, count>. code setup. AL ; generates: "mov al, 10" 51
增加和減去, 16 位元版本 TITLE Add and Subtract, Version 2 (Add. Sub 2 r. asm) INCLUDE Irvine 16. inc. data val 1 DWORD 10000 h val 2 DWORD 40000 h val 3 DWORD 20000 h final. Val DWORD ? . code main PROC mov ax, @data ; initialize DS mov ds, ax mov eax, val 1 ; get first value add eax, val 2 ; add second value sub eax, val 3 ; subtract third value mov final. Val, eax ; store the result call Dump. Regs ; display registers exit main ENDP END main 55
57
- Slides: 57