0x01:环境配置

直接参考文章:https://blog.csdn.net/gaofengyakun/article/details/81516497
然后可以用以下代码测试一下:

1
2
3
4
5
6
7
8
9
Include irvine32.inc
.code
main proc
mov eax,1000h
add eax,4000h
call dumpregs
exit
main endp
End main

如果上述代码编译成功,出现黑窗口,则配置成功
vs下面环境的配置可以

0x02:调试

首先打开监视窗口:
调试–>窗口–>监视
然后任选一个窗口,vs下方就会出现如下的框框

以上面的程序为例,我们先在mov eax,5 处打一个断点,然后F5调试,F11继续执行

当执行完mov sum,eax后我们在下方输入sum,查看sum的值

0x03:一些基础知识

3.1:变量和常量

在讨论变量和常量之前,首先要清楚汇编里面的数据类型,以及寄存器的位数

数据类型:

1
2
3
4
5
6
7
8
9
10
11
8位整数:S代表有符号
BYTE
SBYTE

16位整数:
WORD
SWORD

32位整数:
DWORD
SDWORD

寄存器:

1
2
3
4
5
6
7
8
8位:
al,bl,cl,dl,dil,sil等

16位:
ax,bx,cx,dx,di,si等

32位:
eax,ebx,ecx,edx,edi,esi等

变量和常量都是定义在数据段的(.data)
如下例子定义了一个变量sum,数据类型为DWORD,初始值为0

1
2
.data
sum DWORD 0

如果不想给数据赋初值,可以用?来代替初值,表示不赋初值

1
2
.data
sum DWORD ?

3.2:等号伪指令

感觉有点像c语言中的宏定义

1
name = expression

在程序运行时,会自动将所有的name替换为expression
比如

1
COUNT= 500

在运行时

1
mov eax,COUNT

会被自动替换为

1
mov eax,500

####3.3:计算相关指令

1
2
3
4
5
6
7
8
9
10
加法:
add
inc(一个操作数)

减法:
sub
dec(一个操作数)

取反:
neg

3.4:SIZEOF计算字符长度

计算结果是占的字节数

1
2
3
4
.data
intArray WORD 32 DUP(0) ;32个WORD类型大小的数组,初始化为0
.code
mov eax,SIZEOF intArray ;结果为32*2=64

0x04:第一个简单的汇编程序(两数相加)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.386	;表示是一个32位程序,能访问32位寄存器和地址
.model flat,stdcall ;flag为内存模式,stdcall是子程序的调用规范
.stack 4096 ;为运行时堆栈保留4096字节的存储空间
ExitProcess PROTO,dwExitCode:DWORD

.data ;数据段
sum DWORD 0 ;定义变量sum,数据类型为DWORD,值为0

.code ;代码段
main PROC
mov eax,5
add eax,6
mov sum,eax

INVOKE ExitProcess,0
main ENDP ;标记一个过程的结束
END main ;标记一个程序的结束

0x05:简单的输出一个数组中的元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
arrayW WORD 1000h,2000h,3000h
.code
main PROC
mov esi,OFFSET arrayW ;OFFSET求出arrayW数组的起始偏移量
mov ax,[esi]
mov ax,[esi+2] ;因为一个WORD占两个字节
mov ax,[esi+4]

INVOKE ExitProcess,0
main ENDP
END main

对于byte类型的数组,可以用inc来自增

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
arrayB BYTE 10h,20h,30h ;注意每个元素的大小最大只能为8位(一个字节)
.code
main PROC
mov esi,OFFSET arrayB
mov al,[esi]
inc esi
mov al,[esi]
inc esi
mov al,[esi]

INVOKE ExitProcess,0
main ENDP
END main

最后更新: 2018年09月24日 19:46

原始链接: http://drac0nids.top/2018/09/13/汇编课程学习,持续更新/

× 请我吃糖~
打赏二维码