一、开发环境
我使用visual studio 2022 preview,其他版本的设置大同小异。
第一步:
打开visual studio,点击“创建新项目”:
第二步:
visual studio并没有专门的汇编项目,所以需要挂羊头卖狗肉,选择C++空项目
第三步:
输入项目名称,点击创建
第四步:
鼠标右键单击项目名称——>生成依赖项——>生成自定义,点击masm,这样才能把masm加入到项目的生成工具中
第五步:
鼠标右键单击源文件——>添加——>新建像,选择C++文件,但文件扩展名要改为.asm,编译器才能自动的使用masm编译
第六步:
因为64位汇编比较简单,初学时把配置改为Release、X64,了解深入后再探索32位汇编
大功告成!
如果用visual studio 2019,可以安装AsmDude插件,辅助编写汇编代码。但它目前不支持visual studio 2022
二、汇编语言的基础知识
1、哲学思考
(1)汇编语言的特点
与硬件相关,每一种处理器都有相应的汇编语言;
与机器码相关,指令通常与机器码一一对应;
家用电脑使用intel/amd处理器,对应x86-x64汇编语言。
(2)汇编语言的作用
深入理解硬件工作原理;
充分利用计算机特性(如SIMD,即单指令多数据);
开发操作系统内核、驱动程序等;
优化程序。
(3)汇编语言无用论
汇编语言代码难以维护;
编译器优化足够先进,无需汇编语言(编译器可实现循环展开、内联展开等,减少跳转,而汇编语言开发难以实现);
高级语言也可以实现同样的功能,汇编语言与高级语言相比并无优势。
(4)汇编语言有害论
汇编语言给黑客、病毒、作弊外挂大开方便之门(反驳一:工具价值中立;反驳二:软件破解为普通人节省大量金钱)。
(5)汇编语言也是高级语言论
在许多CPU中,汇编语言指令并非直接操作硬件,而需通过硬件制造商提供固件内的程序编译成“微指令”再执行,这与高级语言没有说很么不同。
2、数学基础
(1)二进制、十进制、十六进制转换和运算(可借助windows计算器)。
(2)浮点数的存储:
real4:符号1位+指数8位+小数23位(整数部分1省略);
real8:符号1位+指数11位+小数52位(整数部分1省略);
real10:符号1位+指数15位+小数64位(整数部分1省略)。
3、寄存器
汇编语言使用的寄存器实际上并不是物理寄存器,而是在通过一定的操作映射CPU内部特定的物理寄存器。主要包括:
(1)通用寄存器16个,可以通过通常的指令读写:
全部64位 | 0-31位 | 0-15位 | 8-15位 | 0-7位 |
---|---|---|---|---|
rax | eax | ax | ah | al |
rbx | ebx | bx | bh | bl |
rcx | ecx | cx | ch | cl |
rdx | edx | dx | dh | dl |
rsi | esi | si | sil | |
rdi | edi | di | dil | |
rbp | ebp | bp | bpl | |
rsp | esp< |