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
上一篇 下一篇

猜你喜欢

热点阅读