汇编基础02:第一个程序

Catalogue
  1. 1. 汇编基础02:第一个程序
    1. 1.1. Visual Studio 2015 使用:
    2. 1.2. 第一个程序:
    3. 1.3. 汇编基本元素
      1. 1.3.1. 数据类型
    4. 1.4. 伪指令&运算符

汇编基础02:第一个程序

Visual Studio 2015 使用:

创建汇编项目:

  • 新建项目
  • 模板 , Visual C++ , Win32, 控制台程序
  • 名称随便起,确定
  • 选中项目右键“生成自定义”,选择MASM生成规则
  • 右击右边的资源管理器中的源文件,添加,新建项,新建一个.asm后缀的新文件
  • 选中项目右键–属性–链接器–系统–子系统选<控制台(SUBSYSTEM:CONSOLE)>
  • 选中项目右键–属性–链接器–高级–入口点–填写 “main”
  • 写代码运行即可

调试汇编程序:

  • 右击项目名称,选择重新生成,然后点上面工作栏的本地Windows调试器即可
  • 可进行断点执行
  • 通过调试窗口中可将寄存器显示调出来

高亮插件:

  1. 菜单栏–工具–扩展和更新
  2. 联机–搜索AsmDude–安装

第一个程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
.586
;指定指令集,工作在386版本的都行

.MODEL flat, stdcall
;使用的内存模式:flat(win32使用的内存模式)
;函数调用约定:stdcall(用于win32 API)

includelib user32.lib
includelib kernel32.lib
;导入库

ExitProcess PROTO, dwExitCode : DWORD
MessageBoxA PROTO hWnd : DWORD, lpText : BYTE , lpCaption : BYTE, uType : DWORD
;声明的win32API的原型
;这里还能写option语句
;option casemap:none
;制定是否大小写敏感

;段
;.data,生成的时候占用空间
;.data?未初始化数据段
;const常量段,可以读不能写
;code代码段,不可写
;stack堆栈段,可读可写可执行

.data
Number DWORD 0
text db "hello world",0
;数据段,声明多大整多大
;定义数据,可读可写,程序直接放在内存里
;.data?:不会占用exe的大小,是程序运行的时候申请的
;.const:常量,可读不可写

.code
main proc;入口点需要自己指定
;函数体,可以加参数
mov eax ,5
mov ebx ,6
add eax ,ebx
add eax ,Number
push 0
push offset text
push offset text
push 0
call MessageBoxA
sub esp ,16
call ExitProcess
main ENDP
;结束函数
END main
;结束程序流程

;代码段,所有指令都要写在代码段中
;数据段不可执行,代码段可执行

汇编基本元素

整数常量

  • 十六进制: 012h
  • 八进制: 12q
  • 十进制: 12d
  • 二进制: 101010b

字符常量

  • ‘A’

字符串常量

  • “asdad”
  • ‘asdasd’

保留字

  • 指令:mov,lea….
  • 寄存器:eax,ebx….
  • 属性:db,dword…
  • 运算符

标识符

  • 只能以下划线字母开头
  • 不能与保留字相同

伪指令

  • .data
  • offset,invoke

指令

  • mov eax,12

注释

  • ;

数据类型

整数

  • byte 8 位 无符号
  • sbyte 8 位 有符号
  • word 16位 无符号
  • sword 16位 有符号
  • dword 32位 无符号
  • sdword 32位 有符号
  • fword 48位 有符号 用于保护模式的远指针
  • qword 64位 整数
  • tbyte 80位 整数

实数(浮点数)

  • real4 32位 短实数
  • real8 64位 长实数
  • real10 80位 扩展实数

伪指令

  • db 8位整数 类似c的char 可以保存ASCII

  • dw 16位整数

  • dd 32位整数或实数

  • dq 64位整数或实数

  • dp 80位整数或实数

伪指令&运算符

offset 获取偏移量

[地址]是获取地址中的值

ptr:选择“位数”的值,也就是获取值的一部分

type:获取类型的大小

type

lengthof:计算数组元素

mov eax ,offset lengthof arr

sizeof:数组占用空间

typedef:类似于C语言

pbyte typedef ptr byte

给变量一个别称