一、介绍
- 汇编语言是一种面向机器的低级程序设计语言
- 汇编语言以助记符形式表示每一条计算机指令
- 助记符是便于人们记忆、并能描述指令功能和指令操作数的符号
- 助记符一般就是表明指令功能的英语单词或其缩写
-
MOV AX , 30H ADD AX , 50H MOV [2100H] , BX HLT
- 汇编语言的主要特点:
- 汇编语言程序与处理器指令系统密切相关
- 程序员可直接、有效的控制硬件系统
- 形成的可执行文件运行速度快、占用主存容量少
- 汇编语言程序中可以出现不同进制的数,但一定要有标识字母加以区别
- 数据的组织形式:位(bit)、字节(Byte)、字(Word)、双字(Dword)
- 无论是数据还是指令在计算机中都是以二进制形式存放的
- 无符号整数——所有有效位都当作数值处理,当然这样的数全部都是正数,故不保留符号位,常用于表示地址,或运算中表示计数值等
- ASCII编码——在内存中使用一个字节(8位二进制数)存放一个字符(它的ASCII码),最高位没用(写0).在通信过程中最高位有时用于奇偶校验
- 数码0~9:30H~39H
- 大写字母A~Z:41H~5AH
- 小写字母a~z:61H~7AH
- 空格:20H
- 带符号数的表示方法——采用补码表示法(补码存储、补码运算)
- 与、或、异或、非运算
二、计算机硬件相关知识
1、硬件
- 中央处理单元CPU
- 控制器、运算器、寄存器
- 存储器
- 主存储器:RAM和ROM
- 辅助存储器:磁盘、光盘、U盘
- 外部设备
- 输入设备和输出设备
2、软件
- 系统软件
- 应用软件
3、寄存器、存储器地址、端口(I/O地址)
- AX BX CX DX SI DI BP SP(16位)
- EAX EBX ECX EDX ESI EDI EBP ESP(32位)
- 存储器是由大量存储单元组成,需要用编号区别每个单元:编号=地址
- 存储器地址是存储器中存储单元的编号
- 每个存储单元存放一个字节量的数据,一个字节B(Byte)=8个二进制位数b(bit)
- 采用十六进制数来表示地址
- 存储器地址表示为:00000H~FFFFFH
- 其中大写H(或小写h)表示十六进制数
- I/O接口电路由接口寄存器组成,需要用编号区别各个寄存器:编号=地址
- I/O地址是接口电路中寄存器的编号
DATA SEGMENT ... DATA ENDS CODE SEGMENT ASSUME ... START: ... ... CODE ENDS END START
- 数据寄存器用来存放计算的结果和操作数,也可以存放地址
- 每个寄存器又有他们各自的专用目的
- EAX——累加器,使用频度最高,用于算数、逻辑运算以及与外设传送信息等
- EBX——基址寄存器,常用作存放存储器地址
- ECX——计数器,作为循环和串操作等指令中的隐含计数器
- EDX——数据寄存器,常用来存放双字长数据的高16位,或存放外设端口地址
- 变址寄存器常用于存储器寻址时提供的地址
- ESI是源变址寄存器
- EDI是目的变址寄存器
- 指针寄存器用于寻址内存堆栈内的数据
- ESP为堆栈指针寄存器,指示栈顶的偏移地址,不能再用于其他目的,具有专用目的
- EBP为基址指针寄存器,表示数据在堆栈段中的基地址
- ESI和EDI在串操作指令有特殊用法
- ESP和EBP寄存器与SS段寄存器联合使用确定堆栈段中的存储单元地址
- 堆栈(Stack)
- 堆栈是主存中一个特殊区域
- 它采用先进后出FILO或后进先出LIFO的原则进行存取操作,而不是随机存取操作的方式
- 堆栈通常由处理器自动维持
- 在80X86中,由堆栈段寄存器SS和堆栈指针寄存器ESP共同指示
- 指令指针EIP
- 指令指针寄存器EIP,指示代码段中指令的偏移地址
- 它与代码段寄存器CS联用,确定下一条指令的物理地址
- 计算机通过CS:EIP寄存器来看你告知指令序列的执行流程
- EIP寄存器是一个专用寄存器
- 程序连续自动执行的关键
- 标志寄存器
- 标志(EFlag)用于反映指令执行结果或控制指令执行形式
- 8086处理器的各种标志形成了一个16位的标志寄存器FLAGS(程序状态字PSW寄存器)
15···12 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF ZF AF PF CF
-
- 状态标志——用来记录程序运行结果的状态信息,许多指令的执行都将相应的设置它
CF ZF SF PF OF AF
-
- 控制标志——可由程序根据需要用指令设置,用于控制处理器执行指令的方式
DF IF TF
-
- 进位标志CF——当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF=1;否则CF=0
- 零标志ZF——若运算结果为0,则ZF=1,否则ZF=0
- 溢出标志OF——若算术运算的结果有溢出,则OF=1,否则OF=0
- 符号标志SF——运算结果最高位为1,则SF=1;否则SF=0
- 有符号数据用最高有效位表示数据的符号,所以最高有效位就是符号标志的状态
- 奇偶标志PF——当运算结果最低字节中"1"的个数为零或偶数时,PF=1;否则PF=0
- PF标志仅反映"1"的个数是偶或奇
- 方向标志DF——用于串操作指令,控制地址的变化方向
- 设置DF=0,存储器地址自动增加
- 设置DF=1,存储器地址自动减少
- 中断允许标志IF——用于控制外部可屏蔽中断是否可以被处理器响应
- 设置IF=1,则允许(开)中断
- 设置IF=0,则禁止(关)中断
- CLI指令复位中断标志:IF=0
- STI指令置位中断标志:IF=1
- 陷阱标志TF——用于控制处理器进入单步操作方式
- 设置TF=0,处理器正常工作
- 设置TF=1,处理器单步执行指令
- 单步执行指令——处理器在每条指令执行结束时,便产生一个编号为1的内部中断,这种内部中断称为单步中断,所以TF也称为单步标志
- 利用单步中断可对程序进行逐条指令的调试
- 这种诸条指令调试程序的方法就是单步调试
判断溢出:双符号位法 3AH+7CH AAH+7CH 0 0011 1010 1 1010 1010 0 0111 1100 0 0111 1100 ———————————— —————————————— 0 1011 0110 0 0010 0110 符号位不同OF=1 符号相同OF=0 CF=0 CF=1
-
- 溢出和进位
- 进位标志表示无符号数运算结果是否超出范围,超出范围后运算结果不正确
- 溢出标志表示有符号数运算结果是否超出范围,超出范围后运算结果不正确
- 处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志CF;同时,根据是否超出有符号数的范围设置溢出标志OF
- 应该利用哪个标志,则由程序员来决定。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出
- 溢出和进位
- 段寄存器
- CS——代码段寄存器
- DS——数据段寄存器
- ES——附加数据段寄存器
- SS——堆栈段寄存器
4、内存组织结构
- 计算机中信息的单位
- 二进制位Bit:存储一位二进制数:0或1
- 字节Byte:8个二进制位,D7~D0
- 字Word:16位,2个字节,D15~D0
- 双字DWord:32位,4个字节,D31~D0
- 最低有效位LSB:数据的最低位,D0位
- 最高有效位MSB:数据的最高位,对应字节、字、双字分别指D7、D15、D31位
- 存储器需要利用地址区别
- 每个存储单元都有一个编号;被称为存储器地址(以字节为单位编制)
- 每个存储单元存放一个字节的内容(8位二进制数)
- 多字节数据存放方式
- 多字节数据在存储器中占连续的多个存储单元
- 存放:低字节存入低地址,高字节存入高地址
- 表达:用低地址表示多字节数据占据的地址空间
- 物理地址和逻辑地址
- 每个物理存储单元有一个唯一的20位编号,即物理地址:00000H~FFFFFH
- 分段后用户编程时,采用逻辑地址:段基地址:段内偏移地址
- 段寄存器的作用(8086有4个16位段寄存器,每个段寄存器确定一个逻辑段的起始地址,每种逻辑段均有各自的用途)
- CS——指明代码段的起始地址
- 代码段寄存器CS存放代码段的段地址
- 指令指针寄存器IP指示下条指令的偏移地址
- 处理器利用CS:IP取得下一条要执行的指令
- SS——指明堆栈段的起始地址
- 堆栈段确定堆栈所在的主存区域
- 堆栈段寄存器SS存放堆栈段的段地址
- 堆栈指针寄存器SP指示堆栈栈顶的偏移地址
- 处理器利用SS:SP操作堆栈顶的数据
- DS——指明数据段的起始地址
- 数据段存放运行程序所用的数据
- 数据段寄存器DS存放数据段的段地址
- 各种主存寻址方式(有效地址EA)得到存储器中操作数的偏移地址
- 处理器利用DS:EA存取数据段中的地址
- ES——指明附加段的起始地址
- 附加段是附加的数据段,也用于数据的保存
- 附加段寄存器ES存放附加段的段地址
- 各种主存寻址方式(有效地址EA)得到存储器中操作数的偏移地址
- 处理器利用ES:EA存取附加段中的数据
- 串操作指令将附加段作为其目的操作数的存放区域
- CS——指明代码段的起始地址
- 如何分配各个逻辑段
- 程序的指令序列必须安排在代码段
- 程序使用的堆栈一定在堆栈段
- 程序中的数据默认是安排在数据段,也经常安排在附加段,尤其是串操作的目的区必须是附加段
- 数据的存放比较灵活,实际上可以存放在任何一种逻辑段中
- 段超越前缀指令
- 没有指明时,一般的数据访问在DS段;使用BP访问主存,则在SS段
- 默认的情况允许改变,需要使用段超越前缀指令
来源:https://www.cnblogs.com/SunTabLe/p/12638850.html