Day1:x86汇编框架、数据类型、基本运算、位运算
vs2022汇编环境、x86汇编框架、数据类型、基本运算、位运算
在vs2022中编写汇编代码
新建一个空项目
在工具栏的“工具”选项中选择“获取工具和功能”,在“使用C++的桌面开发”中勾选“Windows 10 SDK”以及“MSVC v142 -VS 2015 C++生成工具”,然后安装这些新勾选的选项,更新VS2022

右键新建的空项目,选择最下方的“属性”,在弹出来的页面中选择“常规”,然后将平台版本改成windows10,可能需要改也可能不需要

右键新建的空项目,选择“生成依赖性”,然后是“生成自定义”,在界面中选择masm

然后就可以新建一个.asm源文件了。新建完成后,右键源文件选择“属性”,然后在“常规”里检查项类型是否为“Microsoft Macro Assembler”

以上是针对报错进行的尝试修正总结,可能有多余或者不足之处
x86汇编框架(MASM)
xxxxxxxxxx2 1int num[2][2] = { {1,2},{3,4} };2printf(“%d,%d,%d,%d”, num[0][0], num[0][1], num[1][0], num[1][1]);c
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;预处理
.586
.model flat,stdcall
;包含的链接库
includelib ucrt.lib
includelib legacy_stdio_definitions.lib
includelib kernel32.lib
includelib user32.lib
;外部函数声明
extern printf:proc
;数据段
.data
szHello db 'HelloWorld!',0
;代码段
.code
;函数声明
main proc
lea eax,szHello
push eax
call printf
add esp,4
main endp
end重点如下:
链接库声明
1
includelib NameOfLib.lib不同的段
1
2.NameOfSection
;段所包含的数据函数格式
1
2
3functionName proc 参数名1:参数类型,参数名2:参数类型...
;汇编代码
functionName endp在一个asm文件末尾,需要
1
2end ;用于无入口点,即非可执行文件,不需要主函数时
end main ;用于可执行文件,必须指定入口点(如main函数)时
数据类型
| 类型名称 | 简写 | 对应类型 | 占用字节数 |
|---|---|---|---|
| BYTE | db | char | 1 |
| WORD | dw | short | 2 |
| DWORD | dd | int | 4 |
| QWORD | dq | long long | 8 |
基本运算
数据传送指令
1
2
3
4mov dest,src ;dest=src
;eax=1示例
mov eax,1地址传送指令
1
2
3
4lea dest,[addr] ;dest=addr
;eax=77E75F38示例
lea eax,77E75F38加法
1
2
3
4
5add dest,src ;dest=dest+src
;1+1=2示例,最后eax里为2
mov eax,1
add eax,1自增
1
2
3
4inc dest ;dest=dest+1
;eax++示例
inc eax减法
1
2
3
4
5sub dest,src ;dest=dest-src
;6-2=4示例,最后eax里为4
mov eax,6
sub eax,2自减
1
2
3
4dec dest ;dest=dest-1
;eax--示例
dec eax乘法
1
2
3
4
5
6
7
8
9
10
11;分为mul(无符号)和imul(有符号)
;乘法结果存放在edx和eax中(edx:eax),低位eax,高位edx。未指定时,eax默认作为一个因数
mul src ;edx:eax=eax*src
imul src ;edx:eax=eax*src
imul dest,src ;dest=dest*src
imul dest,src,imm ;dest=src*imm
;4*2=8示例,eax*ebx
mov eax,4
mov ebx,2
mul ebx除法
1
2
3
4
5
6
7
8
9
10;分为div(无符号)和idiv(有符号)
;被除数放在edx:eax中,除数任意,商存放在eax中,余数存放在edx中
div src ;edx:eax%src=eax...edx
idiv src ;edx:eax%src=eax...edx
;101%2...1示例
mov eax,101
mov edx,0
mov ebx,2
div ebx
位运算
与
1
2
3
4
5
6and dest,src ;dest=dest & src
;1&2=0示例
mov eax,1
mov ebx,2
and eax,ebx或
1
2
3
4
5
6or dest,src ;dest=dest | src
;1|2=3示例
mov eax,1
mov ebx,2
or eax,ebx取反
1
2
3
4
5not dest ;dest=~dest
;not 00000001=11111110示例
mov eax,1
not eax异或
1
2
3
4
5
6xor dest,src ;dest=dest^src
;1^2=3示例
mov eax,1
mov ebx,2
xor eax,ebx左移,右移
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15;左移
shl dest,count ;dest=dest<<count
;1<<3=8示例
mov eax,1
mov cl,3
shl eax,cl
;右移
shr dest,count ;dest=dest>>count
;8>>3=1示例
mov eax,8
mov cl,3
shr eax,cl
Day1:x86汇编框架、数据类型、基本运算、位运算