汇编
第一章.计算机基础知识
1.1硬件

主存储器(内存储器):
RAM:随机存储器:
DRAM:电容储存:C+mos 慢 大
SRAM:触发器:光电管储存 快 小
ROM:只读存储器
高速缓冲存储器(Cache):由于DRAM很慢因此中间加一个SRAM加快传给CPU的速度
辅助存储器(外存储器):磁表面存储器、光存储器和半导体闪速存储器等三大类
1.2计算机中的数制
- 数的表示形式
位:bit
字节:byte:8bit
字(word):假使是8086微机储存16位,则字长为2B
双字(Dword):字的两倍字长
- 数制:
十进制数(D) 、二进制数(B) 、八进制数(O或Q) 和十六进制数(H)
不同数制的相互转换
(了解常识:十六进制等的加减乘除)
学会与,或,非,异或
1.3计算机中的数和字符的表示
字符表示:ASCII码
重点记忆:
0
9: 30H39HA
F: 41H46Ha
f: 61H66H
SP:20H(空格)
LF:0A(换行)
CR:0D(回车)
BCD码
包括压缩BCD码和非压缩BCD码
压缩BCD码例子: 0000 0010 0000 0001:表示21
非压缩BCD码例子:0010 0001表示21
第二章.80X86微处理器及系统结构
1.大致
首先这张图要大致记住

执行单元EU:执行指令
接口单元:BIU接总线
了解流水操作,在顺序执行时利用微机预接收指令以提高效率,同时要注意断流风险和瓶颈问题
数据总线为16位,一次处理2B数据
地址总线为20位,所以经过一系列求和操作才能传
寄存器是由触发器组成的储存单位位于cpu中有14个寄存器,都为16位。
对于通用寄存器由上图可知一共八个,由于考虑兼容性把Ax分为AH和AL
2.详细
- 
标志寄存器
寄存器就是存储器,寄存器在cpu内部,存储器在cpu外部
最底下的是标志寄存器,只用16位的9位,有六个标志位三个控制位
详细介绍:
标志位:
C标志位:进位位(看有没有向符号位之前进位,有为1无为0)
P标志位:奇偶位(看加完后有偶数个1就为1)
A标志位:半进位位(从右向左第三位有无进位,有为1无为0.用来判断10进制是否要补偿6)
Z标志位:零标志位(结果为0为1,结果为1它为0)
S标志位:符号标志位(正数为0负数为1)
O标志位:溢出位(溢出为1)
控制位:
- TF:单步运行位
- IF:中断允许控制位,cpu终止正在运行的程序转向其他请求再回来
- DF:方向控制位:0为递增,1为递减



80X86
一共二十位地址 1M=2^20(0000H~FFFFFH)
由于一次要读16字节(2B),用相邻的高地址做高字节,自己做低字节
分段+读取
第三章 80X86指令系统
指令
[标号:]指令助记符 目的操作数,源操作数[;注释]
eg:mov AL,BL[;把BL数据送给AL]
寻址方式
找源操作数
操作数类型
操作数依其所在的不同位置可分为三种类型:立即数(最快),寄存器操作数,存储器操作数(最慢)
立即寻址方式
操作数类型为立即数,存放在指令中
eg: mov AX ,2000H
寄存器寻址方式
操作数在寄存器中,在指令中指明寄存器的名称,通常用于寄存器之间的传送数据
eg: mov AX ,BX
直接寻址方式
直接寻址方式中操作数地址是16位偏移量直接包含在指令中,而操作数则默认在数据段中
eg mov AX,[2000H] 以2000H为地址的那个数是操作数,默认为数据段DS
也就是通过2000H 和DS寻找物理地址
假设DS是1000H
10000
+2000
=12000
要读16位就是要读取12000H及12001H
寄存器间接寻址
eg: mov AX,[BX] 以寄存器内容为地址,地址内的内容为操作数,只能是BX BP SI DI
假设BX为2000H 没有特别指明找DS(仅DI SI BX),SS(BP)
假设DS=1000H
AX跟上面3一样
寄存器相对寻址方式
以指定的寄存器内容加上指令中给出的位移量D,并以一个段寄存器为基准给出操作数的地址
eg: mov AX,[BX+100H] 以方括号内的结果为地址
假设BX=1F00H
加起来就为2000H
结果仍然跟上面一样
基址变址寻址方式
用一个基址寄存器和变址寄存器的值相加为操作数的偏移地址
eg: mov AX,[BX+DI] 方括号内即为地址(BP BX为基址寄存器)(SI DI为变址寄存器)以机制为准,BX找DS BP找SS
相对基址变址寻址
eg: mov AX,[BX+DI+100H]
指令系统
- OPD:表示目的操作数
- OPS:表示源操作数
- mem:表示内存单元
- reg:表示通用寄存器
- seg:表示段寄存器
- imm:表示立即数
数据传送指令
mov AX,BL 是错误的,AX是16位,BL是八位
mov AX,0是可以的
mov [2000H],0H 是错误的,0不知道是16位还是8位
可改为 mov BYTE PTR[2000H],0H 相当于00H送进来
或 mov WORD PTR[2000H],0H
立即数不能给段赋值:mov DS,2000H 错误
两内存中不允许互相传数据:mov [Bx],[2000H] 错误
ip,cs不允许做目的操作数 mov Ip(cs),Ax错误
XCHG指令
交换指令,指令格式:XCHG OPD,OPS
没有立即数,和段寄存器
同时两内存也不能交换!!
只能通过通用寄存器reg来交换
eg:MOV AX,[3000H]
XCHG [2000H],AX
MOV [3000H],AX
XLAT指令
查表指令,格式:XLAT TABLE或XLAT
eg:
MOV BX,2000H 先要把首地址给BX
MOV AL,06H 然后把偏移量给AL
XLAT; AL=24H=36

指令PUSH和POP
堆栈指令格式PUSH OPD 先让SP-2送完+2
POP OPdata segment
BUF db 2,4,1,0,6,9,4,0,3,0
RESULT db ?
data ends
code segment
assume cs:code,ds:data
start:mov ax,data
mov ds,ax
mov al,0
mov cx,10
lea si,BUF
l1: mov bl,[si]
cmp bl,0
JNE NEXT
inc al
NEXT: inc si
loop l1
mov RESULT,al
mov al,0
mov ax,4c00h
int 21h
code ends
end startD
OPD必须是16位,不允许是立即数只能是通用寄存器段寄存器和内存单元
SS:堆栈段
SP:堆栈指针
堆栈是地址向下递减的空间

标志传送指令
LAHF
取标志寄存器的低8位传送到AH
SAHF
把AH送回去
PUSHF
先将SP-2然后把标志寄存器入栈
POPF
取出标志寄存器,SP+2
地址传送指令
有效地址指令LEA
格式LEA OPD,OPS 把OPS 的地址送给OPD
OPS只能为变量名,标号,地址表达式
示例 ,指令的区别
LEA BX,[2000H] BX=[2000H]
MOV BX,[2000H] BX=地址2000H的值
算数运算指令
加法指令
ADD加法指令(影响所有标志位)
格式:ADD OPD,OPS 不允许是段 OPD=(OPS+OPD)
ADC带进位加法指令(影响所有标志位)
格式:ADC OPD,OPS OPD=(OPS+OPD+CF)
INC指令(对进位位不影响)
格式:INC OPD OPD=OPD+1

减法指令
- 减法指令SUB
格式:SUB OPD,OPS OPD=OPD-OPS
带借位减法指令SBB
格式:SBB OPD,OPS
减1指令DEC
格式:DEC OPD
求补指令NEG
指令:NEG OPD(只能是通用或内存)
对0求补时,CF=0,其他情况CF=1
比较指令CMP
格式:CMP OPD,OPS OPD-OPS 结果不回送只影响标志位
乘法指令
无符号数乘法指令MUL
格式:MUL OPD
(操作数可以是reg和mem不能是立即数)
乘数默认,保存地址默认
8位 * 8位=16位: (AL)*OPD=(AX)
16位 * 16位=32位: (AX)*OPD=(DX)(AX)
有符号数乘法指令IMUL
格式:IMUL OPD
除法指令
无符号数除法指令DIV
格式:DIV OPD
16位/8位 (AX)/OPD=(AL)……(AH)
32位/16位 (DX).(AX)/OPD=(AX)……(DX)
有符号数除法指令IDIV
格式:DIV OPD
符号扩展指令
- 字节扩展为字CBW 被扩展的放在AL或
- 字扩展为双字CWD Ax
十进制数调整指令
分为压缩BCD码和非压缩BCD码
压缩BCD码加法调整指令
DAA
压缩BCD码减法调整指令
DAS
非压缩BCD码加法调整指令
AAA
非压缩BCD码减法调整指令
AAS
非压缩BCD码乘法调整指令
AAM
- 非压缩BCD码除法调整指令
AAD
逻辑运算指令
AND OR NOT XOR TEST 只影响SF ZF PF
AND OPD,OPS
OR OPD,OPS
NOT OPD
XOR OPD,OPS
TEST OPD,OPS 两个相与完结果不回送,只影响上面三个标志位
移位指令
格式
SAL(算数)/SHL(逻辑) OPD(对象),OPS(次数)
eg:算术左移两次
MOV CL,02H
SAL AL,CL
右移:
SAR OPD,OPS
SHR OPD,OPS
循环移位指令
ROL OPD,OPS:不带进位循环左移
ROR OPD,OPS:不带进位循环右移
RCL OPD,OPS:带进位循环左移
RCR OPD,OPS:带进位循环右移
控制转移指令
jmp 无条件转移指令
jcc 条件转移语句
无符号数比高低,有符号数比大小,
A表示高,B表示低
G表示大,L表示小
eg:JNL 不小于 JGE 大于等于
JB低于 , JA大于
JE相等 JZ为零
jcxz lable 判断cx的值是否为0
循环控制指令
循环指令默认利用cx计数器,循环次数先给cx,先做cx=cx-1,判断cx是否等于0,等于零退出循环.
loop cx=0
loopz cx=0 or zf=1
loope
call and ret
eg:
1 | assume cs:code |

处理器控制指令
- nop 没用
- lock 暂时封锁
- hit 暂时停止
- esc 交权指令
- wait 等
标志操作指令
- clc 清零
- stc 置一
- cmc 进位位求反
前三条操作进位位
cld DF位置零
std DF位置置一
cli 把中断标志位置零
sti 中断标志位置一
汇编语言程序格式
- $指的是当前地址(ip)
特殊运算符
- 强制类型运算符 PTR
eg:mov al,byte ptr var
- lea,offset
eg:lea bx,var
= mov bx,offset var
- type
db=1,dw=2,dd=4,near=-1,far=-2
- length
求dup重复的次数,不是dup为1
- size
=length*type
- seg
求段地址
模块通信伪指令
- PUBLIC 符号 定义一个全局符号说明
- EXTRN 符号:类型 声明另一边的PUBLIC
系统功能调用
MS-DOS 的调用过程
将系统调用号送AH寄存器
在指定的寄存器中设置有关入口参数
INT 21H:DOS的中断处理程序
返回DOS的系统调用4CH
MOV AH,4CH
INT 21H
单个字符输出
AH=02,要显示的字符存于DL中,即DL=字符的ASCII码
MOV AH,2
MOV DL,’A’
INT 21H
字符串输出
AH=09,要输出的字符串的首地址存于DX寄存器中,即入口参数DS:DX=字符串首地址,字符串必须以$为结尾
MOV AH,09
LEA DX,BUF
INT 21H
字符输入
AH=01,从键盘输入一个字符
MOV AH,01
INT 21H
字符串输入
AH=0AH,从键盘输入一个字符串,入口参数DS:DX=缓冲区首地址,用回车键表示输出结束
分支程序
输入一个字符,输出大写
1 | code segment |




