第一章.计算机基础知识

1.1硬件

![屏幕截图 2024-03-25 222641](E:\study\汇编\huiphoto\屏幕截图 2024-03-25 222641.png)

主存储器(内存储器):

  1. RAM:随机存储器:

    DRAM:电容储存:C+mos 慢 大

    SRAM:触发器:光电管储存 快 小

  2. ROM:只读存储器

  3. 高速缓冲存储器(Cache):由于DRAM很慢因此中间加一个SRAM加快传给CPU的速度

  4. 辅助存储器(外存储器):磁表面存储器、光存储器和半导体闪速存储器等三大类

1.2计算机中的数制

  1. 数的表示形式

位:bit

字节:byte:8bit

字(word):假使是8086微机储存16位,则字长为2B

双字(Dword):字的两倍字长

  1. 数制:

​ 十进制数(D) 、二进制数(B) 、八进制数(O或Q) 和十六进制数(H)

  1. 不同数制的相互转换

    (了解常识:十六进制等的加减乘除)

    学会与,或,非,异或

1.3计算机中的数和字符的表示

  1. 字符表示:ASCII码

    重点记忆:

    09: 30H39H

    AF: 41H46H

    af: 61H66H

​ SP:20H(空格)

​ LF:0A(换行)

​ CR:0D(回车)

  1. BCD码

    包括压缩BCD码和非压缩BCD码

    压缩BCD码例子: 0000 0010 0000 0001:表示21

    非压缩BCD码例子:0010 0001表示21

第二章.80X86微处理器及系统结构

1.大致

首先这张图要大致记住

![屏幕截图 2024-03-27 205437](E:\study\汇编\huiphoto\屏幕截图 2024-03-27 205437.png)

  1. 执行单元EU:执行指令

  2. 接口单元:BIU接总线

  3. 了解流水操作,在顺序执行时利用微机预接收指令以提高效率,同时要注意断流风险和瓶颈问题

  4. 数据总线为16位,一次处理2B数据

    地址总线为20位,所以经过一系列求和操作才能传

  5. 寄存器是由触发器组成的储存单位位于cpu中有14个寄存器,都为16位。

  6. 对于通用寄存器由上图可知一共八个,由于考虑兼容性把Ax分为AH和AL

2.详细

  1. ![屏幕截图 2024-03-27 210434](E:\study\汇编\huiphoto\屏幕截图 2024-03-27 210434.png)

标志寄存器

寄存器就是存储器,寄存器在cpu内部,存储器在cpu外部

最底下的是标志寄存器,只用16位的9位,有六个标志位三个控制位

详细介绍:

标志位:

  1. C标志位:进位位(看有没有向符号位之前进位,有为1无为0)

  2. P标志位:奇偶位(看加完后有偶数个1就为1)

  3. A标志位:半进位位(从右向左第三位有无进位,有为1无为0.用来判断10进制是否要补偿6)

  4. Z标志位:零标志位(结果为0为1,结果为1它为0)

  5. S标志位:符号标志位(正数为0负数为1)

  6. O标志位:溢出位(溢出为1)

控制位:

  1. TF:单步运行位
  2. IF:中断允许控制位,cpu终止正在运行的程序转向其他请求再回来
  3. DF:方向控制位:0为递增,1为递减

71749862752295884435ab738430578c

86d63778c588ef98c500968738340040

image-20240512193519190

80X86

一共二十位地址 1M=2^20(0000H~FFFFFH)

由于一次要读16字节(2B),用相邻的高地址做高字节,自己做低字节

分段+读取

第三章 80X86指令系统

指令

[标号:]指令助记符 目的操作数,源操作数[;注释]

eg:mov AL,BL[;把BL数据送给AL]

寻址方式

找源操作数

操作数类型

操作数依其所在的不同位置可分为三种类型:立即数(最快),寄存器操作数,存储器操作数(最慢)

  1. 立即寻址方式

    操作数类型为立即数,存放在指令中

    eg: mov AX ,2000H

  2. 寄存器寻址方式

    操作数在寄存器中,在指令中指明寄存器的名称,通常用于寄存器之间的传送数据

    eg: mov AX ,BX

  3. 直接寻址方式

    直接寻址方式中操作数地址是16位偏移量直接包含在指令中,而操作数则默认在数据段中

    eg mov AX,[2000H] 以2000H为地址的那个数是操作数,默认为数据段DS

    也就是通过2000H 和DS寻找物理地址

    假设DS是1000H

    10000

    +2000

    =12000

    要读16位就是要读取12000H及12001H

  4. 寄存器间接寻址

    eg: mov AX,[BX] 以寄存器内容为地址,地址内的内容为操作数,只能是BX BP SI DI

    假设BX为2000H 没有特别指明找DS(仅DI SI BX),SS(BP)

    假设DS=1000H

    AX跟上面3一样

  5. 寄存器相对寻址方式

    以指定的寄存器内容加上指令中给出的位移量D,并以一个段寄存器为基准给出操作数的地址

    eg: mov AX,[BX+100H] 以方括号内的结果为地址

    假设BX=1F00H

    加起来就为2000H

    结果仍然跟上面一样

  6. 基址变址寻址方式

    用一个基址寄存器和变址寄存器的值相加为操作数的偏移地址

    eg: mov AX,[BX+DI] 方括号内即为地址(BP BX为基址寄存器)(SI DI为变址寄存器)以机制为准,BX找DS BP找SS

  7. 相对基址变址寻址

    eg: mov AX,[BX+DI+100H]

指令系统

  1. OPD:表示目的操作数
  2. OPS:表示源操作数
  3. mem:表示内存单元
  4. reg:表示通用寄存器
  5. seg:表示段寄存器
  6. 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

image-20240408185848026

指令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:堆栈指针

堆栈是地址向下递减的空间

7b96a3bc013128a0f7f5853ce95741b8

标志传送指令

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的值

算数运算指令

加法指令

  1. ADD加法指令(影响所有标志位)

    格式:ADD OPD,OPS 不允许是段 OPD=(OPS+OPD)

  2. ADC带进位加法指令(影响所有标志位)

    格式:ADC OPD,OPS OPD=(OPS+OPD+CF)

  3. INC指令(对进位位不影响)

    格式:INC OPD OPD=OPD+1

    image-20240408195457734

减法指令

  1. 减法指令SUB

格式:SUB OPD,OPS OPD=OPD-OPS

  1. 带借位减法指令SBB

    格式:SBB OPD,OPS

  2. 减1指令DEC

    格式:DEC OPD

  3. 求补指令NEG

    指令:NEG OPD(只能是通用或内存)

    对0求补时,CF=0,其他情况CF=1

  4. 比较指令CMP

    格式:CMP OPD,OPS OPD-OPS 结果不回送只影响标志位

乘法指令

  1. 无符号数乘法指令MUL

    格式:MUL OPD

    (操作数可以是reg和mem不能是立即数)

    乘数默认,保存地址默认

    8位 * 8位=16位: (AL)*OPD=(AX)

    16位 * 16位=32位: (AX)*OPD=(DX)(AX)

  2. 有符号数乘法指令IMUL

    格式:IMUL OPD

除法指令

  1. 无符号数除法指令DIV

    格式:DIV OPD

    16位/8位 (AX)/OPD=(AL)……(AH)

    32位/16位 (DX).(AX)/OPD=(AX)……(DX)

  2. 有符号数除法指令IDIV

    格式:DIV OPD

  3. 符号扩展指令

    1. 字节扩展为字CBW 被扩展的放在AL或
    2. 字扩展为双字CWD Ax

十进制数调整指令

分为压缩BCD码和非压缩BCD码

  1. 压缩BCD码加法调整指令

    DAA

  2. 压缩BCD码减法调整指令

    DAS

  3. 非压缩BCD码加法调整指令

    AAA

  4. 非压缩BCD码减法调整指令

    AAS

  5. 非压缩BCD码乘法调整指令

​ AAM

  1. 非压缩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:带进位循环右移

控制转移指令

  1. jmp 无条件转移指令

  2. jcc 条件转移语句

  3. 无符号数比高低,有符号数比大小,

    A表示高,B表示低

    G表示大,L表示小

    eg:JNL 不小于 JGE 大于等于

    ​ JB低于 , JA大于

    ​ JE相等 JZ为零

  4. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
assume cs:code
code segment
mov al,20h
call s
......
s: mov ah,0
mov cl,10
div cl
or al,30h
mov bh,al
or ah,30h
mov bl,ah
ret
mov ax,4c00h
int 21h
code ends
end

image-20240422185445606

处理器控制指令

  1. nop 没用
  2. lock 暂时封锁
  3. hit 暂时停止
  4. esc 交权指令
  5. wait 等

标志操作指令

  1. clc 清零
  2. stc 置一
  3. cmc 进位位求反

前三条操作进位位

  1. cld DF位置零

  2. std DF位置置一

  3. cli 把中断标志位置零

  4. sti 中断标志位置一

汇编语言程序格式

  • $指的是当前地址(ip)

特殊运算符

  1. 强制类型运算符 PTR

eg:mov al,byte ptr var

  1. lea,offset

eg:lea bx,var

= mov bx,offset var

  1. type

db=1,dw=2,dd=4,near=-1,far=-2

  1. length

求dup重复的次数,不是dup为1

  1. size

=length*type

  1. seg

求段地址

模块通信伪指令

  1. PUBLIC 符号 定义一个全局符号说明
  2. EXTRN 符号:类型 声明另一边的PUBLIC

系统功能调用

  1. MS-DOS 的调用过程

    将系统调用号送AH寄存器

    在指定的寄存器中设置有关入口参数

    INT 21H:DOS的中断处理程序

  2. 返回DOS的系统调用4CH

    MOV AH,4CH

    INT 21H

  3. 单个字符输出

    AH=02,要显示的字符存于DL中,即DL=字符的ASCII码

    MOV AH,2

    MOV DL,’A’

    INT 21H

  4. 字符串输出

    AH=09,要输出的字符串的首地址存于DX寄存器中,即入口参数DS:DX=字符串首地址,字符串必须以$为结尾

    MOV AH,09

    LEA DX,BUF

    INT 21H

  5. 字符输入

    AH=01,从键盘输入一个字符

    MOV AH,01

    INT 21H

  6. 字符串输入

    AH=0AH,从键盘输入一个字符串,入口参数DS:DX=缓冲区首地址,用回车键表示输出结束

分支程序

输入一个字符,输出大写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
code segment
assume cs:code
start:mov ah,01h
INT 21H
cmp al,'a'
jb exit
cmp al,'z'
ja exit
sub al,20h
mov al,dl
mov ah,02h
int 21h
exit: MOV AH, 4CH
int 21h
code ends
end start