3.2整数相加减
TITLE Add and Substract;TITLE整行注释 ;author:Hk_Mayfly ;date:2019/09/06 INCLUDE Irvine32.inc;调用函数 .code;代码段 main PROC;PROC标识一个过程的开始(相当于标志一个函数定义的开始) mov eax,10000H; add eax,20000H sub eax,10000H call DumpRegs;调用一个显示CPU寄存器值的过程 main ENDP;和16位code ends类似,ENDP表示结束一个过程 END main;和end start类似,表示汇编程序结束,main标号标识了过程的入口地址
TITLE Add and Substract;TITLE整行注释 ;author:Hk_Mayfly ;date:2019/09/06 INCLUDE Irvine32.inc;调用函数 .386;程序要求的最低CPU .model flat,stdcall;.model为保护模式程序生成代码 .stack 4096; ExitProcess PROTO, dwExitCode:DWORD DumpRegs PROTO;PROTO声明了该程序使用的过程原型,相当于函数声明 .code;代码段 main PROC;PROC标识一个过程的开始(相当于标志一个函数定义的开始) mov eax,10000H; add eax,20000H sub eax,10000H call DumpRegs;调用一个显示CPU寄存器值的过程 INVOKE ExitProcess,0;返回0,相当于函数调用 main ENDP;和16位code ends类似,ENDP表示结束一个过程 END main;和end start类似,表示汇编程序结束,main标号标识了过程的入口地址
3.3 汇编链接执行周期
3.4 定义数据
数据定义语法:
[name] directive initializer [,initializer]...
下面是数据定义语句的一个例子:
count DWORD 12345
类型 | 用法 |
---|---|
BYTE | 8 位无符号整数,B 代表字节 |
SBYTE | 8 位有符号整数,S 代表有符号 |
WORD | 16 位无符号整数 |
SWORD | 16 位有符号整数 |
DWORD | 32 位无符号整数,D 代表双(字) |
SDWORD | 32 位有符号整数,SD 代表有符号双(字) |
FWORD | 48 位整数(保护模式中的远指针) |
QWORD | 64 位整数,Q 代表四(字) |
TBYTE | 80 位(10 字节)整数,T 代表 10 字节 |
REAL4 | 32 位(4 字节)IEEE 短实数 |
REAL8 | 64 位(8 字节)IEEE 长实数 |
REAL10 | 80 位(10 字节)IEEE 扩展实数 |
也可以用
伪指令 | 用法 | 伪指令 | 用法 |
---|---|---|---|
DB | 8位整数 | DQ | 64 位整数或实数 |
DW | 16 位整数 | DT | 定义 80 位(10 字节)整数 |
DD | 32 位整数或实数 |
3.4.10 为AddSub添加变量
TITLE Add and Substract ;author:Hk_Mayfly ;date:2019/09/06 INCLUDE Irvine32.inc .data Num1 DWORD 10000H Num2 DWORD 20000H Num3 DWORd 30000H Sum Dword 0 .code main PROC mov eax,Num1 add eax,Num2 add eax,Num3 mov Sum,eax call DumpRegs exit main ENDP END main
3.4.12 本节习题
1.Val SWORD ? 2.Val BYTE ? 3.Val SBYTE ? 4.Val QWORD ? 5.SDWORD 6.Val SDWORD 10000000000000000000000000000000 7.wArray WORD 1,2,3 8.Color BYTE "Blue" 9.dArray DWORD 50 dup(?) 10.Val BYTE 500 dup('TEST') 11.bArray BYTE 20 dup(0) 12.21h,43h,65h,87h
3.5 符号常量
3.5.5 本节习题
1.VK_BS = 08h 2.SecondsInDay = 24*60*60 3.ArraySize = ($-myArray) 4.ArraySize = ($-myArray)/4 5.PROCEDURE TEXTQU6.sample TEXTQU <"Hello_World"> MyString BYTE sample 7.SetupESI TEXTQU
3.8 编程练习
1,三个整数相减
参考3.2节中的AddSub程序,编写三个16位整数相减的程序,程序中只需要使用寄存器即可,插入调用DumpRegs函数语句,以显示寄存器的值。
TITLE Add and Substract ;author:Hk_Mayfly ;date:2019/09/06 INCLUDE Irvine32.inc .data Num1 WORD 1000H Num2 WORD 2000H Num3 WORD 4000H .code main PROC mov eax,0 mov ax,Num3 sub ax,Num2 sub ax,Num1 call DumpRegs exit main ENDP END main
2,数据定义
写一个程序,要求包含3.4节中列出的所有数据类型的定义,用合适的值初始化每个变量
TITLE Add and Substract ;author:Hk_Mayfly ;date:2019/09/06 INCLUDE Irvine32.inc .data Num1 BYTE 'abc' Num2 SBYTE -10H Num3 WORD 1000H Num4 SWORD -1000H Num5 DWORD 10000H Num6 SDWORD -10000H Num7 FWORD 100000H Num8 QWORD 123456789ABCDEF0H Num9 TBYTE 123456789123456789H Num10 REAL4 2.56 Num11 REAL8 2.12345 Num12 REAL10 2.12345678 .code main PROC mov eax,0 mov al,[Num1+1] mov al,Num2 mov eax,0 mov ax,Num3 mov ax,Num4 mov eax,0 mov eax,Num5 mov eax,Num6 call DumpRegs exit main ENDP END main
3,整数符号常量
写一个程序,定义对应一周内每天的符号常量,创建一个数组变量并使用这些符号作为初始值
TITLE Add and Substract ;author:Hk_Mayfly ;date:2019/09/06 INCLUDE Irvine32.inc .data WEEK BYTE 'Mon' BYTE 'Tue' BYTE 'Wed' BYTE 'Thu' BYTE 'Fri' BYTE 'Sat' BYTE 'Sun' ;STR_LEN = ($-WEEK) .code main PROC mov eax,0 shr eax,16 mov al,[WEEK];'W' shl eax,16 mov ah,[WEEK+1];'e' mov al,[WEEK+2];'d' call DumpRegs exit main ENDP END main
4,文本符号常量
写一个程序为几个字符串(引号括起的字符)定义符号名。在变量定义中分别使用每个符号
TITLE Add and Substract ;author:Hk_Mayfly ;date:2019/09/06 INCLUDE Irvine32.inc .data Str1 TEXTEQU <"Hello_World!"> Str2 TEXTEQU <"I_Love_CTF!"> Str3 TEXTEQU <"REVE"> Str4 TEXTEQU <'Q'> .code main PROC mov eax,0 mov al,[Str4] mov eax,[Str3] call DumpRegs exit main ENDP END main