NJUPT 计软院 复习资料

NJUPT【 汇编语言 】

2021-05-22  本文已影响0人  TanX

一.数制

真值数和补码数之间的转换方法 : [[X]] = X

设设机器数字长n, n位补码数,

    **有符号数真值范围为 -2^n-1^ ~ +2^n-1^-1**

     **无符号数其数值范围为**  0~2^n^-1

<center>常用ASCII码</center>

原数字 ASCII(D) ASCII(H)
0 48 30H
A 65 41H
a 97 61H
CR(回车) 13 0DH
换行 10 0AH

二.基本结构

字长:字长是微处理器一次可以直接处理的二进制数码的位数

实模式特点

  1. 加电复位之后,486自动工作在实模式,系统在DOS管理下
  2. 实模式下,486只能访问第一个1M(==220==)内存(00000H - FFFFFH)
  3. 存储管理部件对存储器只进行分段管理,没有分页功能,一个逻辑段最大容量为==64K==
  4. 实模式下,段寄存器中存放段基址

保护模式特点:

  1. 支持多任务操作系统
  2. 保护模式下,可以访问4G(232)物理存储空间
  3. 采用分段和分页功能

三个存储地址空间:

冯诺以曼体系

CPU: 运算器和控制器

主要包括以下几个部分:存储器、运算器、控制器、输入设备、输出设备

486内部结构

<center>常用通用寄存器</center>


通用寄存器

指令 = 操作码 + 操作数

32位微处理器地址空间

  1. 物理空间:程序的运行空间,即主存空间,在486中,共32条地址线,内存最大容量为4G
  2. 虚拟空间: 编程空间,虚拟存储器是一项硬件和软件相结合的技术。

状态标志寄存器

8086标志寄存器共有15个标志位置,分为两类 状态标志控制标志

1.条件(状态)标志

进位标志: A标:低半字节位是否出现借位或者是进位,有为1,无为0

辅助进位: C标:最高为值是否出现借位或者是进位,是为1,无为0

O标:是否溢出,是则1,无则0,如果最高位不同,一定不会溢出。

Z标:结果是否为0,是则1,无则0

P标:运算结果低8位中1结果的1的次数是否为偶数,是则1,否则0

S标:最高位是否为1,是则1,否则0

2.控制标志

TF标:设置为1时,CPU进入单步模式,所谓单步模式就是CPU在每执行一步指令后都产生一个单步中断

IF标志:IF为1时,CPU允许响应外部的可屏蔽中断请求。I=0的时候屏蔽

DF标:。使用CLD指令清0, DF为1时,串操作指令按递减方式改变有关[存储器](https://baike.baidu.com/item/存储器)指针值,每次操作后使SI、DI递减。

实模式下物理地址的形成

逻辑段 段基址存放在 偏移地址存放在
代码段 CS IP
堆栈段 SS SP
数据段 DS 根据不同的寻址方式BX、BP、SI、DI
附加段 ES/FS/GS 根据不同的寻址方式BX、BP、SI、DI

CS、IP的初值: 由操作系统赋值

SS、SP的初值:

DS/ES/FS/GS的初始值:由程序员赋值

BX/SI/DI/BP的初始值:由程序员赋值


三.汇编基本知识

a. 操作数寻址方式:star::star::star::star::star:

指令当中的操作数 : 立即数、 寄存器数、内存操作数、I\O端口操作数

那么各个数有各个访问操作数的方式:

1.立即数寻址

直接用立即数进行赋值

mov ax, 1000H 将1000H赋值给ax

2.寄存器寻址

直接把一个寄存器的值送给另一个寄存器

mov ax,bx ;将bx寄存器的值赋值到ax中

3.直接寻址

  1. 段寄存器:[偏移地址]

    偏移地址用立即数来表示的为直接寻址

    mov al, es:[2CH]  从ES段偏移地址位2CH的单元取数 -> al
    mov ax, ds:[2000H] 从数据段偏移地址为2000H的单元取一字, ->ax
    
  2. 段寄存器:变量名

    mov ax, es:[YY] YY里面的内容作为偏移地址
    

4.间接寻址

又称间接寻址,间址。操作数在内存单元中,段基址放在段寄存器中,偏移地址在==间址寄存器==当中。

地址表示:段寄存器:[间址寄存器]

物理地址 = 段寄存器 * 16 + 间址寄存器

<center><i>表1.间址寄存器和约定访问逻辑段

间址寄存器 约定访问的逻辑段
BP 堆栈段 SS 16位寻址方式
BX, SI, DI 数据段 DS 16位寻址方式
EBP, ESP 堆栈段 SS 32位寻址方式
EAX~EDX, ESI, EDI 数据段 DS 32位寻址方式
mov ax, [bx]    //约定的默认段寄存器为DS, 所以会访问 DS:[BX]

5.基址寻址

基址寻址的地址表达式:段寄存器:[基址寄存器+位移量]

物理地址: 段寄存器 * 16 + 基址寄存器 + 位移量

<center><i>表2.基址寄存器和约定访问逻辑段

变址寄存器 约定访问的逻辑段 适用于
BP 堆栈段 16位
BX 数据段 16位
EBP, ESP 堆栈段 32位
EAX~EDX, ESI ,EDI 数据段 32位
mov al, [bx + 2] 物理地址:DS * 16 + bx + 2

6.变址寻址

基址寻址的地址表达式:段寄存器:[比例因子变址寄存器+位移量]*

物理地址 :段寄存器 * 16 + 比例因子 * 变址寄存器 + 位移量

<center><i>表3.变址寄存器和约定访问逻辑段

变址寄存器 约定访问的逻辑段 适用于
SI, DI 数据段 无比例因子,16位寻址
EBP 堆栈段 有比例因子, 32位寻址
EAX~EDX, ESI ,EDI 数据段 有比例因子,32位寻址

==如何区别变址和基址寻址?==

我们通过表1和表2可以知道,在基址寻址过程中,我们使用的基址寄存器为BP、BX,而变址寄存器中使用的位SI、DI。所以我们可以作出区分。

7. 基址+变址寻址

基址寻址的地址表达式:段寄存器:[基址寄存器 + 比例因子变址寄存器+位移量]*

mov al, [BX + SI + 0250H] 物理地址= DS * 16 + BX + SI + 0250H

末.总结

mov al, 0120H       立即寻址
mov al, Bl          寄存器寻址
mov AL,DS:[1000H]   直接寻址
mov AL,BUF          直接寻址
mov AL,[BX]         间址寻址
mov AL,[BX+1]       基址寻址
mov AL,[SI+1]       变址寻址
mov AL,[BX+SI]      基址加变址寻址

b. 汇编语言指令

语句是汇编语言汇编和执行的单位,汇编语言源程序包括的语句类型位:指令性语句和指示性语句。

标号代表该条指令的符号地址

符号指令和机器指令是一一对应的关系。

1.常用伪指令语句

2.常用运算符

  1. $运算符

    作用:代表所在位置的地址

    BUF DB ‘assembly is ok’ ;字符串长度位14
    LLL EQU $-BUF ;返回从BUF运算符到当前位置的长度,也就是一共分配了多少单元
    
  2. SEG 运算符

    作用:计算某一段逻辑段的段基址

    mov ax, SEG DATA
    mov ds ,ax
    
  3. OFFSET 运算符

    作用:计算某个变量名和标号名所在单元的偏移量

    BUF DB 12H, 34H, 56H
    MOV BX OFFSET BUF
    MOV AL, [BX] ;AL = 12H
    
  4. PTR 运算符

    作用:临时修改某一单元内存的属性

    类型属性确定的操作数

    • 寄存器操作数
    • 用变量名直接寻址的内存操作数

    类型属性不确定的操作数

    • 立即数
    • 非变量名定义的内存操作数(带括号)
    BUF DB 11H,22H,33H,44H
    
    EXAMPLE_1:
        MOV AX, BUF ;不正确,前后位数不一样
        MOV AX , WORD PTR BUF ;AH = 22H, AL = 11H
    EXAMPLE_2:
     MOV BUF, 1234H              ;错误
     MOV WORD PTR BUF, 1234H      ;正确,BUF单元变为34H, BUF+1单元变为12H
    EXAMPLE_3:
     MOV BX, OFFSET XX
     MOV [BX], 12H
     MOV BYTE PTR [BX], 12H  ;将BX单元的内容变为12H
     MOV WORD PTR [BX], 12H  ;将BX单元的内容变为12H,将BX+1单元的的内容变为00H
    

3.汇编基本指令集

1.通用传送类指令
  1. 数据传送指令

    mov des , source
    
    WARNING:
     MOV DS, 1000H ;不合法,立即数不能直接赋值给段寄存器
     MOC CS, 1000H   ;不合法,不嫩修改CS的值
    
  2. 符号扩展指令

    MOVSX: 符号位向高位扩展,再送给目标操作数

    MOVZX:符号位高位补0, 再送给目标操作数

    movsx DL, -16        ;DL = F0H
    movsx bx, dl     ;bx = FFF0H 符号位为1,扩1
    movzx bx, dl     ;bx = 00F0H 括0
    
  3. 有效地址传送指令

    LEA运算符等效于OFFSET运算符

    lea bx, buf ==  mov bx, offset buf
    
  4. 交换指令

    XCHG:两个操作数互换;

    说明: 段寄存器、 立即数不能参加互换

    2个内存操作数不能参与互换,前后属性要一致。

2.堆栈操作类指令
堆栈

栈顶在栈区的低地址,栈底在栈区的高地址。

堆栈段寄存器 SS;

堆栈指针ESP和 SP;

  1. 进栈指令

    PUSH 源操作数

    SP = SP - 2
    高8位 --> SS:[SP+1] 高字节
    低8位 --> SS:[SP]
    
    PUSH WORD PTR [BX] ;将DS:[BX]的内容压栈
    
  2. 出栈

    SP = SP + 2
    SS:[SP] -- > 低8位
    SS:[SP+1] --> 高8位
    
3.运算类指令

二进制加法:

4.BCD码调整指令
  1. DAA指令默认的操作对象是AL寄存器,将AL寄存器里面的值变为BCD码

    ;计算1234+5678=? 结果用BCD码表示
    ;数据段
    N1 DW 1234H
    N2 DW 5678H
    SUM DW ?
    ;代码段
    MOV AL, BYTE PTR N1
    ADD AL, BYTE PTR N2
    DAA
    MOV BYTE PTR SUM, AL
    MOV AL, BYTE PTR N1+1
    ADD AL, BYTE PTR N2+1
    DAA
    MOV BYTE PTR SUM+1, AL
    
  2. DAS

    默认操作对象是AL,对AL中的组合BCD差值进行修正。

    • 若被减数>减数,调整后,C标=0,AL=组合BCD码差值;
    • 若被减数<减数,调整后,C标=1,AL=差值相对于模100的补数。
    ;计算56-78 = ?
    
    ;数据段
    MOV AL, 56H
    SUB AL, 78H
    DAS ;结果:C=1,AL=78H
    
5.转移指令
6.子程序调用与返回类指令
7.串传送指令

说明

格式

8.逻辑运算指令
名称 格式 功能 影响的标志位
逻辑与操作 AND S Z P
逻辑或指令 OR S Z P
逻辑非指令 NOT 不影响
异或指令 XOR 异或 S Z P
测试指令 TEST 测试 S Z P

Test指令:Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。

如果结果为0,那么ZF标志位为1 使用JZ跳转
9.移位指令

操作数智能为cl寄存器或者是立即数

  1. 逻辑左移位 : SAL 或 SHL ,低位补0, 进位到CF中
  2. 逻辑右移位: SHR, 高位补0 无符号数
  3. 算术右移位: SAR ,高位补原来的最高位 符号位保持不变
  4. 循环右边移位:


    image
10.处理机控制类指令

CLC ;复位进位标志:CF←0
STC ;置位进位标志:CF←1
CLD ;复位方向标志:DF←0
STD ;置位方向标志:DF←1
CLI ;复位中断标志:DF←0
STI ;置位中断标志:DF←1

四.汇编语言程序设计

1.完整的源程序结构

  1. 用方式选择伪指令来说明该程序的微处理器类型
  2. 用段定义语句定义每一个逻辑段
  3. 用ASSUME语句说明段约定
  4. 用汇编结束语句说明源程序到此结束
.586 ;方式定义 表示整个源程序经过汇编链接之后生成哪种CPU类型的机器指令 向下兼容 如果缺省直接8086
DATA SEGMENT USE16 ;段定义语句,USE16定义,有效对有效地址为16位,逻辑段长度最大运行为64K 缺省的是USE32 所以在实模式下不能忘记\
...
DATA ENDS       ;段结束 

CODE SEGMENT USE16          ;定义代码段
    ASSUME CS:CODE, DS:DATA ;段约定,用来表示CODE段和CS寄存器进行绑定,DATA段和DS寄存器进行绑定。
BEG:
    MOV AX, DATA
    MOV DS, AX
    ...
    MOV AH,4Ch
    INT 21H         ;程序结束到此结束,把操作权给汇编程序
CODE ENDS
END BEG                     ;通知汇编程序,源程序到此结束法,用BEGIN

2. 开发过程

编辑程序 –> .ASM文件 –> 汇编程序 –> .OBJ文件 –> 链接程序 –> .EXE文件

a.asm --> ml /c a.asm --> link a.obj --> a.exe

3.开发格式

  1. .exe
  2. .com 优先级比exe高

异同点

EXE文件:允许源程序使用多个逻辑段

                实模式下,每个逻辑段不超过64K

COM文件:源程序只允许一个逻辑段 就是代码段

需要使用定位ORG指令将程序的启动指令放在 代码段偏移地址为100H的单元地址

程序使用的数据可以集中在代码段的开始或者末尾

4.DOS功能调用

BIOS/DOS调用模式

MOV AH, 功能号
设置入口参数
INT 21H
分析出口参数

功能号:

  1. 01H 等待键入一个字符,有回显,相映Ctrl_C
  2. 02H 显示一个字符 从DL读入 但是会破坏AL寄存器的内容
  3. 07H 等待键入一个字符,无回显
    1. 出口参数 : AL=按键的ASCII码
  4. 08H 等待键入一个字符
  5. 09H 显示一个字符串
    1. 入口参数: DS:DX = 字符串首地址,字符串必须以 ‘&’(ASCII码为24H)为结束符号
  6. 0AH 等待键入一串字符串送入数据缓冲区
    1. 入口参数: DS:DX 指向放入的字符的缓冲区
    2. 出口参数: 存放于缓冲区的字符串,以回车键结尾

5.BIOS功能调用

  1. 01H 查询键盘缓冲区

    • 出口参数: Z标志 = 0 , 有键入,键代码仍保留在键盘缓冲区中,此时AL= 键入字符的ASCII码,AH=键入字符的扩展码 Z标志=1,表示无键入
  2. 0EH 显示一个字符

    • 入口参数 从AL读入
  3. 13H 显示一个字符串

    • 入口参数 属性字节BL ,
image

5.程序设计格式

  1. 分支程序设计
  2. 循环程序设计

6.子程序设计

7.宏指令程序设计

宏体被COPY一份插入在位置上。是由汇编程序执行的。所以不会减少体积。

宏程序和子程序的异同点:

相同点:宏指令与子程序都可以简化程序设计,增强程序的可读性

不同点:

8.代码转换

.586
DATA SEGMENT USE16
  MESG DB 'Please Enter!',0DH,0AH,'$'
DATA ENDS
CODE SEGMENT USE16
  ASSUME CS:CODE,DS:DATA
BEG:
  MOV BX, DATA
  MOV DS, BX
  ;显示一行字符串
  MOV AH , 9
  MOV DX, OFFSET MESG
  INT 21H
  ;输入一个字符
  MOV AH, 1
  INT 21H
  ;比较字符串
  CMP AL, 39H
  JNA NEXT1
  SUB AL, 7H
NEXT1:
  SUB AL,30H
  ;27行的2号功能会破坏AL的值,所以不能使用AL的值
  MOV BL, AL
  
  ;输出 = 符号
  MOV AH,2
  MOV DL, '='
  INT 21H
  ;输出二进制
  CALL DISP
  
  ;输出B
  MOV AH,2
  MOV DL, 'B'
  INT 21H
  
EXIT:
  MOV AH, 4CH
  INT 21H
  
;显示函数
DISP PROC
  MOV CX,8
LAST: 
  MOV DL, '0'
  RCL BL,1
  JNC NEXT
  MOV DL, '1'
NEXT:
  MOV AH,2
  INT 21H
  LOOP LAST
  RET
DISP ENDP

CODE ENDS
  END BEG

五.MOOC题目

第一章

image

第二章

image

第四章

image

第五章

image

第六章

image

第七章

image
image
上一篇下一篇

猜你喜欢

热点阅读