第三章 汇编语言基础

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 TEXTQU <PROC>

6.sample TEXTQU <"Hello_World">

MyString BYTE sample

7.SetupESI TEXTQU <mov esi,OFFSET myArray>

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

猜你喜欢

转载自www.cnblogs.com/Mayfly-nymph/p/11477976.html
今日推荐