1.VS2022配置汇编
1.打开VS2022
2.创建新项目
3. Windows桌面向导
4.创建
5.勾选空项目,确定
6.生成依赖项,生成自定义
7.勾选masm,确定
8.如图修改
9.添加,新建项
10. .cpp后缀改为.asm
11.代码
TITLE Hello World!
OPTION CASEMAP:NONE ;大小写敏感,NONE:敏感;ALL:不敏感
INCLUDELIB ucrt.lib ;引入静态数据链接库,相当于#include <stdio.h>
INCLUDELIB legacy_stdio_definitions.lib
INCLUDELIB kernel32.lib ;ExitProcess
.MODEL FLAT,STDCALL ;FLAT:存储模式(平坦内存模式)
;STDCALL:语言类型(从右向左压栈)
;声明需要使用的函数头
printf PROTO C, ;printf,不由被调用者清栈,而是由调用者负责清栈
:DWORD, ;格式控制串首地址
:VARARG ;输出项
scanf PROTO C, ;scanf,不由被调用者清栈,而是由调用者负责清栈
:DWORD, ;格式控制串首地址
:VARARG ;输入项
ExitProcess PROTO, ;exit program
dwExitCode:DWORD ;return code
.DATA ;全局静态区
msg DB "Hello World!", ;分配字符串空间,存储“Hello,World!”
0dh, 0ah, 0 ;回车,换行
.CODE
main PROC
PUSH OFFSET msg ;获取msp的偏移值,压栈
CALL printf ;调用上面声明的printf
PUSH 0H
CALL ExitProcess
main ENDP
END main
12.设置断点,调试运行
13.打开寄存器
高亮插件:
1.AsmDube 该插件2022暂未更新
2.usertype.bat 详细https://blog.csdn.net/legend94rz/article/details/21830819
缺点:运行正常,但显示红线错误。
2.寄存器
a.8个32位通用寄存器,其中包含4个数据寄存器(EAX、EBX、ECX、EDX)、2个变址寄存器(ESI和EDI)和2个指针寄存器(ESP和EBP)
32位 | 16位 | 高8位 | 低8位 |
---|---|---|---|
EAX | AX | AH | AL |
EBX | BX | BH | BL |
ECX | CX | CH | CL |
EDX | DX | DH | DL |
只能用32位或16位名称访问
32位 | 16位 |
---|---|
ESI | SI |
EDI | DI |
ESP | SP |
EBP | BP |
b.6个段寄存器(ES、CS、SS、DS、FS、GS)
c.1个指令指针寄存器(EIP)
d.1个标志寄存器(EFLAGS)
PSW有6位条件状态位:AF、CF、ZF、PF、SF、OF;
PSW有3位控制状态位:IF、TF、DF
进位标志CF:用于反映运算是否产生进位或借位。如果运算结果的最高位产生一个进位或借位,则CF置1,否则清0。当CF为1时用CY表示;当CF为0时用NC表示。
奇偶标志PF:用于反映运算结果低8位中“1”的个数。如果“1”的个数为偶数,则PF置1,否则清0。当PF为1时用PE表示;当PF为0时用PO表示。
辅助进位标志AF:算数操作结果的第三位(从0开始计数)如果产生了进位或者借位则将其置为1,否则清0。当AF为1时用AC表示;当AF为0时用NA表示。
零标志ZF:用于判断结果是否为0,结果为0,ZF置1,否则清0。当ZF为1时用ZR表示;当ZF为0时用NZ表示。
符号标志SF:用于反映运算结果的符号,运算结果为负,SF置1,否则清0。SF与运算结果的最高位相同。当SF为1时用NG表示;当SF为0时用PL表示。
溢出标志OF:反映有符号数运算是否溢出。如果运算结果超过了有符号数的有效表示范围,则OF置1,否则清0。当OF为1时用OV表示;当OF为0时用NV表示。
跟踪标志TF:当TF被设置为1时,CPU进入单步模式,主要用于程序的调试。
中断标志IF:决定CPU是否响应外部可屏蔽中断请求。IF为1时,CPU允许响应外部的可屏蔽中断请求。IF为1时用EI表示;IF为0时用DI表示。
方向标志DF:决定串操作指令执行时有关指针寄存器的调整方向。当DF为1时,每次操作后使ESI、EDI(SI、DE)递减,否则递增。DF为1时用DN表示;DF为0时用UP表示。
e.MMX寄存器
f.XMM寄存器
3.条件跳转助记符
4.内部数据类型
5. 操作模式
6.Microsoft汇编器常见伪指令
NEAR属性(段内近调用): 调用程序和子程序在同一代码段中,只能被相同代码段的其他程序调用;
FAR属性(段间远调用): 调用程序和子程序不在同一代码段中,可以被相同或不同代码段的程序调用.
7.常见符号
8.常见运算符
9.常见指令
10.标识符
11.寻址方式
获得数据或者数据地址信息的方式称为寻址方式。
(1)立即寻址;(2)寄存器址;(3)直接寻址;(4)间接寻址;(5)相对寻址;(6)基址变址寻址;(7)相对基址变址寻址;(8)隐含寻址;(9)基址寻址;(10)变址寻址;(11)数据串寻址;(12)直接端口寻址;(13)间接端口寻址;(14)段内直接寻址;(15)段内间接寻址;(16)段间直接寻址;(17)段间间接寻址。
一般的寻址方式只说前7类。
12.其他
将AX中的一个两位ASCII码十进制整数转换为非压缩十进制形式的指令是 AND AX,0F0FH
将AX中的一个两位非压缩十进制整数转换为十进制的ASCII码的指令是 OR AX,3030H
将AX中一个无符号二进制整数转换为非压缩十进制数的指令是 AAM
LEA能返回间接操作数的地址,还可以返回堆栈参数的地址,而OFFSET只能返回编译时已知的地址。
信息来自《汇编语言 基于x86处理器 第7版》