Single

汇编学习笔记(一)1 min read

基础知识

[*]汇编语言(asseembly)缺点:
不通用。编写程序比较繁琐,调试,维护,交流,移植困难,需要熟悉计算机硬件系统,考虑许多细节。
汇编语言的缺点使得人们主要采用高级语言进行程序开发工作,有时候需要采用高级语言+汇编语言混合方式,互相取长补短,更好的解决实际问题。

[*]为什么发明高级语言:汇编针对CPU,可能导致同样功能的程序要写几十份代码,因为不同的硬件CPU不一样,指令集/命名/助记符/数量等也不一样,高级语言程序与具体计算机无关,可以在多种计算机上编译后执行(通用性强)

[*]汇编语言优点:
汇编语言程序与处理器指令系统密切相关,形成的可执行文件运行速度快,占用内存容量少,可以编写在”时间”和”空间”两方面最有效的程序,完全发挥硬件的性能,效率高(但取决于开发人员的水平)。在高级语言不能有up/down功能,高级语法要低于汇编语法,不能定义CPU不通用的语法,限制了它的功能。汇编语言才能完全发挥硬件的功能。所以做操作系统必然用汇编。程序员可直接有效地控制系统硬件,针对CPU进行编程(高级语言做不到)

[*]汇编语言应用场合:
程序需要有较快的执行时间,大型软件需要提高性能、优化处理的部分(比如大型游戏),没有合适的高级语言或只能采用汇编语言的时候(比如机械加工/数控机床),分析具体系统尤其是该系统的底层软件/加解密软件/分析和防治计算机病毒等等(比如操作系统,逆向),程序与计算机硬件密切相关,程序需要直接,有效地控制硬件。

[*]汇编语言本质上是机器语言,一行汇编对应一行二进制。

[*]寄存器(Register)是CPU内部的高速存储单元,多少位寄存器,CPU有多大

[*]80×86汇编,X代表版本

[*]指令系统:计算机的指令系统就是指计算机能够执行的所有指令的集合

[*]8086内部结构最重要的是其寄存器组(8个通用寄存器,1个指令指针寄存器[PC,记录代码走到哪里],1个标志寄存器,4个段寄存器)

AX-累加器:使用频率最高,用于算数、逻辑运算以及与外设传送信息等 add
BX-基址寄存器,常用做存放寄存器地址 base
CX-计数器,作为循环和串操作等指令中的隐含计数器,不做循环是通用的 count
DX-数据寄存器,常用来存放双字长数据的高16位,或存放外设端口地址。Data

SI-source 源地址和目的地址
DI-dest 目的地址
BP-BasePoint 栈基址
SP-StackPoint 栈顶
IP-指令指针(即将执行的指令位置)

[*]IP寄存器是一个专用寄存器。

[*]指令一般都是:目的操作数,源操作数(例如MOV ax,bx)

[*]数据的存储单位:

双字Dword 32位 4个字节
word 16位,2个字节
字节byte 8个二进制位
二进制位bit 存储一位二进制数:0或1

[*]中括号([])表示内存的地址

[*]最低有效位LSB:数据最低位

[*]最高有效位MSB:数据的最高位,对应字节、字、双字分别指D7,D15,D31位

[*]每个存储单元都有一个编号:被称为存储器地址,每个存储单元放一个字节的内容

[*]0002H单元存放一个数据34H,表达为[0002H]=34H(debug上不用写“H”)

[*]在debug中只能表示十六进制数值(写入)例如mov byte ptr [100],34

[*]段寄存器:

SS跟SP BP配合
ES DS跟BX SI DI配合
CS跟IP配合

DEBUG基础用法

-a进入编辑模式,(-a 108 进入108地址调试)

-d打印某一段地址的十六进制数据(比如-d 0:100)

-p单步步过

-t单步步入

-g让程序直接运行

-q退出

-r cx xx 设置写入文件的字节大小为xx(xx表示数字,单位为byte,也就是xx*8bit)

AC辅助进位标识 NA无辅助进位

CY进位 NC不进位

PL正数 NG负数(两个有符号运算中,超过7FFF的时候是负数)

NV未溢出 OV溢出(无符号没有溢出)

PE(末尾奇偶标志)PE偶校验 PO奇校验

ZF(零标志,有变成0的寄存器)ZR为零 NZ不为零