计组-期末复习笔记

在这里插入图片描述

分数分布

40选择
45简答(理论+计算)
15编程(不是只有这里考汇编)

作业

1

  1. CPU直接反映运算速度的核心指标是每秒平均执行指令条数(MIPS),为什么?
    由于无论何种程序,编译后最终都是以CPU指令序列的形式存在,因此每秒执行指令数量的多少直接决定了程序执行性能。

  2. 除了直接执行程序以外,还可以如何判断两个程序执行速度的快慢?
    由于相同的硬件条件下,每秒执行指令数相同,因此根据两个程序编译后汇编语言指令的数量来判断程序执行速度的快慢。

  3. 请选择一种编译型语言和一种解释型语言,分别编写一段用于测试语言性能的程序,以该程序反映两种语言在运行速度上的差距(程序与性能测试结果请以截图形式提供)。并解释两种语言的性能差距如何产生?
    两种语言的性能差距主要来源于编译型语言在运行前先编译,运行过程直接执行汇编语言,而解释型语言是在程序运行过程中将高级语言翻译为汇编语言然后再执行,因此翻译过程需要额外的执行时间。

  4. 接上题,在不改变软硬件环境的情况下,若要直接提升上题所编写的解释型语言程序的执行速度,可以采用的方案是什么?并给出提升前和提升后的性能比较结果。
    可以使用特定编译指令,将源代码翻译为指令序列保存,并在执行时直接执行指令序列文件(例如,Python就具有这样特定的指令,请查阅相关资料)

  5. 红白机

    • 请调查红白机的CPU芯片与其指令集,并举出几点该指令集与80X86指令集 CPU的不同之处。
      指令集核心不同在于指令对应的二进制编码不同,以及大量指令的功能不同。

    • 下图的NES文件是为红白机编写的超级马里奥兄弟游戏程序(注意创建时间),从红白机游戏卡带的ROM中提取获得,即图中Virtual NES所运行的游戏程序。为何该程序能够提取并以WINDOWS文件的形式存放在家用计算机上?而事实上, 该程序是不能直接运行在家用计算机上的,这又是为什么?
      无论面向何种CPU芯片的程序,最终的形式都是二进制的指令序列,因此程序可以以二进制流的形式提取并存放在计算机上。然而,由于红白机CPU的指令序列和家用计算机CPU的指令序列不同,因此该程序无法直接在家用计算机上运行。

    • 为何Virtual NES软件能够在家用计算机上执行该游戏程序,它可能实现了什么功能?该功能关联到本章“计算机分层次结构”部分的什么知识?该软件与JAVA程序跨平台运行特性的实现机制相比,两者有何异同之处?
      Virtual NES实现了将红白机CPU指令集转换为家用计算机指令集的功能,该功能关联到虚拟机的知识。与JAVA程序跨平台运行特性相同的是均使用了虚拟机的思想,将一种指令序列编译成实际物理机器能执行的指令序列。

    • 除了计算机层次结构部分,Virtual NES软件还体现本章节的哪些知识要点,如何体现?
      该软件还体现了软硬件逻辑等价的知识点,即同样的游戏程序,既可以使用物理上的红白机执行,也可以在普通家用计算机上使用软件执行。

2

  1. 若补码字长为24位,计算该补码所能表示的最大值和最小值。
    补码最高位代表负最大值,其他位为对应的正值。因此最大值为223-1,最小值为-223.

  2. 若补码码长为8位,计算74与-74在算术左移后的值。计算结果事实上是符合补码溢出情况的,为什么?
    74补码为01001010,左移后值为10010100=-128+16+4=-108
    -74=-128+54,补码为10000000+00110110=10110110,左移后值为01101100=108.
    该左移符合补码溢出的原理,因为补码溢出原理为值上溢超出正最大值部分变为负最大值,下溢则超出负最大值部分变为正最大值,而算术左移相当于把原始值乘以2,因此74算术左移=74*2=148=(127+1)+20 = -128 + 20 = -108
    -74算术左移=-148 = (-128-1)-19 = 127-19 = 108

  3. 请给出浮点数变量a与b的32位二进制形式,并给出计算机以二进制浮点计算a+b与a-b的流程
    float a = 7.625
    float b = -3.0625
    注意对照P38浮点数公式
    7.625 = 4 + 2 + 1 + 0.5 + 0.125 = 111.101 = (-1)^0 * 2^2 * 1.11101, 数符为0,阶码为2+127=129=10000001,尾数为11101,故浮点数为010000001111010…0(末尾18个0)
    -3.0625 = -(2+1+0.0625) = -(11.0001) = (-1)^1 * 2^1 * 1.10001。数符1,阶码128=10000000,尾数10001,浮点数110000000100010…0(末尾18个0)

  4. 为什么C语言的char变量只有8位?
    C语言char变量对应的是ASCII编码,该编码仅有255个字符,因此使用8位变量。

  5. 现需要为一套独立的单片机计算设备编写定长格式指令系统,已知该计算设备的计算芯片有8个寄存器,指令有32条,均为二地址指令,内存空间为256B,指令允许(寄存器,寄存器),(寄存器,内存),(内存,寄存器),(内存,内存)四种双地址,计算该套指令系统的每条指令至少需要多少个二进制位来表示。
    首先,根据要求,指令的二进制格式应当是 操作码+地址类型+地址1+地址2
    首先,32条指令分别需要一个操作码来表示,因此需要5位二进制位
    然后,双地址有四种形式,需要2位二进制位
    8个寄存器需要3个二进制位来表示一个寄存器地址,而256B内存意味着需要256个地址,需要8个二进制位来表示一个地址。考虑到指令是定长指令,而且寄存器和内存地址可以根据上面2位双地址类型区分开,因此地址位数应当就高,都采用8个二进制位。
    综上,每条指令需要二进制位是5+2+8*2=23位。

  6. 已知MOV指令为数据传输指令,请说明以下指令分别将什么数据传入了寄存器AX,被传入数据属于什么寻址方式?
    (1)MOV AX,1000
    将立即数1000传入了AX,属于立即寻址
    (2)MOV AX, [1000]
    将数据段中起始偏移地址为1000的内存数据传入了AX,属于直接寻址
    (3)MOV BX,100
    MOV AX,BX
    将BX的数据传入AX,属于寄存器寻址
    (4)MOV BX,100
    MOV AX, [BX]
    以基址寄存器BX为偏移地址的内存单元数据存入AX,属于基址寻址。

  7. 假设普通的全加器一次计算需要t的时间,当采用完全串行结构时,计算两个N位二进制数相加需要的时间是多少?
    假设使用并行进位加法器,若第m位采用并行进位,该位的并行加法器运算出结果需要的时间是t+0.2×(m-1)^2×t。为什么并行进位位数越高,高位的全加器运算时间增长越大?

    N位二进制数相加需要进行N次全加器运算,在使用串行机构时,时间为N*t
    由于并行进位的高位需要用到前面所有的低位进行运算,因此并行进位位数越高,电路越复杂,运算时间越长。

3

  1. 依次写出以下每条指令运行后AX的值
    MOV AX, 1234H AX= 1234H
    MOV AL, 78H AX= 1278H
    MOV AH,3AH AX= 3478H
    MOV AX, 1H, AH=00H AL=01H

  2. 写出以下寄存器所对应的物理地址分别存放程序的什么信息
    (1)CS:[IP] 指令 (2) DS:[SI]数据段内的数据 (3)SS:[SP]堆栈栈顶数据 (4) [BX] 数据段内数据

  3. 当一个程序加载进内存时,已知代码段加载至以2310H为起始内存地址的内存段,数据段加载至以10230H为起始内存地址的内存段。请回答以下问题

  • CS和DS此时的值应当是多少?
    CS=231H;DS=1023H

  • 当CPU执行了1条3字节的指令和3条4字节的指令后,此时IP的值为?
    IP每执行一条指令,加上该指令长度以指向下一条指令地址,IP值为7

  • 在执行以下指令后,画出数据段此时的数据存储情况,每个内存单元需要同时标注实际物理地址与偏移地址,并回答此时BX=?
    MOV SI,0
    MOV AX, 751AH
    MOV [SI], AX
    ADD [SI], 2
    MOV [SI], AL
    SUB SI, 1
    MOV BX, [SI]

    物理地址10230H10231H10232H
    偏移地址012
    数据1AH75AH1AH

    BX=1A75H

  1. 写出以下操作后FLAG寄存器中各个位的情况

    • MOV AL, FFH
      ADD AL, 1H

      CF = 1 SF = 0 ZF=1 OF=0
    • MOV AL, 7FH
      ADD AL, 1H

      CF = 0 SF = 1 ZF=0 OF=1
    • MOV AX,100H
      MOV BX,200H
      CMP AX,BX

      CF = 1 SF = 1 ZF=0 OF=0
  2. 已知程序堆栈段加载入起始地址为2010H的内存段,回答以下问题
    MOV AX, 12BH
    PUSH AX
    MOV BL, AL
    MOV BH,0
    PUSH BX
    请画出此时堆栈段的情况,在此情况下,继续执行以下命令
    POP DX
    POP CX
    此时DX = ? CX = ?

    物理地址200CH200DH200EH200FH2010H
    数据2B00H2BH01H

    执行POP指令后,DX = 002BH, CX = 012BH

  3. 已知AX=221H BX = 1010H DX = 3030H。请写出当分别执行以下指令后各个寄存器的结果

  • MUL BL; AX=? BX=? DX=?
    该运算相当于AX = AL*BL,DX不受影响,因此AX = 210H, BX = 1010H,DX = 3030H
  • MUL BX; AX=? BX=? DX=?
    该运算相当于DX:AX = AXBX,而AXBX = 223210H,因此AX = 3210H, DX = 0022H, BX不变
  • DIV BL; AX=? BX=? DX=?
    该运算相当于AX/BL,商存AL,余数存AH,因此AL=22H, AH=01H, AX = 0122H, BX不变,DX不变

4

  1. 说明汇编语言代码中DS寄存器与CS寄存器如何初始化?
    DS寄存器初始化需要通过MOV指令,将数据段的起始地址传送到DS。
    CS寄存器根据START标号所在指令地址,自动初始化。

  2. 已知变量定义如下:
    V1 DB 12H
    V2 DW 45H, 678H
    DW F1ACH
    V3 DD 102475H

    • 假设DS = 200H,画出此时数据段的存储情况,并标注V1,V2与V3的物理地址与偏移地址。

      变量V1V2V3
      物理地址2000H2001H2007H
      偏移地址012345678910
      数据12H45H00H78H06HACHF1H75H24H10H00H
    • V1 + 2 = 00H_
      V2 +3 = AC06H___
      V3 – 1 = 102475F1H_

    • 以上变量加减操作如何体现变量的偏移地址属性和类型属性?
      变量加减首先是对变量的地址进行加减,以决定访问数据的起始地址。然后根据变量自身的类型,决定读取的单元数量和读出的数据。

  3. 宏指令与子函数的核心区别是什么?
    宏指令是一种“缩写”,在编译时,宏指令会被直接替换为实际的指令。而子函数则是独立的指令序列,需要通过修改指令寄存器地址进行调用。

  4. 将以下分支代码转换为汇编语言形式,注意寄存器的使用与变量的定义

(1)short int a = 10
short int b = 20
short int c

if (a > b){
 c = a;
}
else if(a < b) {
 c = b;
}
Else{
  c = 0;
}

ans:

DATA SEGMENT
A DW 10
B DW 20
C DW ?
DATA ENDS

CODE SEGMENT
   ASSUME CS:CODE, DS:DATA
Start: MOV AX, DATA
     MOV DS, AX
     MOV AX, A
     MOV BX, B
     CMP AX, BX
     JA L1
     JB L2
     MOV C, 0
     JMP END
 L1:  MOV C, AX
     JMP END
 L2:  MOV C, BX
 END: MOV AH, 4CH
     INT 21H
CODE ENDS
END START
  1. 转汇编
short int a = 10
short int b = 20
short int c = 30

if (a > b) 
{
  if (a > c)
    c = a;
  else
    c = b;
}
Else 
{
  if(b > c)
    c = b;
  else
    c = a;
}

ans:

DATA SEGMENT
A DW 10
B DW 20
C DW 30
DATA ENDS

CODE SEGMENT
   ASSUME CS:CODE, DS:DATA
Start: MOV AX, DATA
     MOV DS, AX
     MOV AX, A
     MOV BX, B
     MOV CX,C
     CMP AX, BX
     JA L1
     JMP L2
L1: CMP AX,CX
     JA L3
     MOV C, BX
     JMP END
  L3: MOV C, AX
     JMP END
L2:CMP BX,CX
   JA L4
   MOV C, AX
   JMP END
L4: MOV C, BX
END: MOV AH, 4CH
     INT 21H
CODE ENDS
END START
  1. 将以下循环代码转换为汇编语言的形式,注意寄存器的使用与变量的定义
String s = ‘HELLO WORLD’;
for(i = 0; i < 11 i++){
     if(s[i] == ‘W’)
       break;
}

ans:

DATA SEGMENT
S DB ‘HELLO WORLD’
DATA ENDS

CODE SEGMENT
   ASSUME CS:CODE, DS:DATA
Start: MOV AX, DATA
     MOV DS,AX
     MOV CX, 11
     LEA SI, S
     LOP: MOV AL, [SI]
         CMP AL, ‘W’
         LOOPNE LOP
CODE ENDS
END START

转汇编:

Short int a = 0;
Short int b = 1;
while(a < 10000){
  a = a + b;
  b = b*2;
}

ans:

DATA SEGMENT
A DW 0
B DW 1
DATA ENDS

CODE SEGMENT
   ASSUME CS:CODE, DS:DATA
Start: MOV AX, DATA
     MOV DS,AX
     MOV AX, A
     MOV BX, B
     LOP: ADD AX, BX
         SAL BX, 1
         CMP AX, 10000
         JB LOP
     MOV AH,4CH
     INT 21H
CODE ENDS
END START
  1. 将以下代码转换为汇编语言的形式,注意需要在数据段中定义专门用于传递函数参数与返回值的变量
int main(){
   SHORT int a[6] = {8,9,0,5,1,7};
   SHORT int b;
   b = max(a, 6);
}

int max(int [] a, int len){
  int c = 0;
  for(i = 0; i < len; i++){
if(a[i] > c)
     c = a[i];
}
  return c;
}

ans:

DATA SEGMENT
  A DW 8, 9, 0, 5, 1, 7
  B DW ?
  ARR DW ?
  LEN DB ?
  MAXVALUE DW ?
DATA ENDS

CODE SEGMENT
   ASSUME CS:CODE, DS:DATA
Start: MOV AX, DATA
     MOV DS, AX
     LEA SI, A
     MOV ARR, SI
     MOV LEN, 6
     MOV MAXVALUE, 0
     CALL MAX
     MOV AH, 4CH
     INT 21H

MAX:MOV SI, 0
     MOV CX, LEN
     LOP: MOV AX, [ARR+SI]
CMP AX, MAXVALUE
JBE L1
MOV MAXVALUE, AX
L1: LOOP LOP
RET


CODE ENDS
END START

第一章

冯诺依曼体系三大要点

  • 二进制
  • 存储程序
  • 五大部件:存储器、运算器、控制器、输入设备、输出设备

存储程序工作方式!

  • 事先编制程序:高级语言–>编译器–>指令序列
  • 事先存储程序:外存–>内存
  • 自动、连续地执行程序:一条条取出指令序列

CPU

CPU区分数据和指令:都采用二进制,外行上没有区别。读取方式有区别:按照地址信息读取指令,按照指令给出的操作数地址读取数据。

ALU:CPU内部,算术逻辑部件,按照指令的要求将有关数据送入ALU,进行制定的算数或逻辑运算,然后将运算结果送到主存单元,或暂存在CPU内的寄存器中。
数据–>ALU–>算数/逻辑运算–>运算结果–>主存单元/CPU寄存器

两大类控制器:组合逻辑控制器(反),微程序控制器(硬件代价小,易于扩充,速度慢)。

主存储器(内存)的单元组成与地址

每个单元8位 = 1字节
单元有唯一编号 = 存储单元地址

总线

总线三大类型:地址总线,控制总线,数据总线

  • 地址总线
    • 决定CPU的寻址能力
    • 8086有20位地址总线 = 最大寻址空间为2^20=1MB = 物理寻址范围从00000H~FFFFFH
    • CPU有N根地址线 = 地址总线宽度为N = 2^N寻址能力
  • 数据总线
    • 决定数据传送速度(单次数据传送量)
    • 8086有16根数据线 = 一次可以传送16位数据(eg. 89D8H)
  • 控制总线
    • 决定cpu对外部器件的控制能力
  • 8086的物理地址
    • 8086是16位结构的CPU,寄存器运算器都是16位结构。
    • 但是有20根地址总线,可以传送20位地址。
    • 所以为了保持这个20的优势+克服16位的限制,8086CPU将1MB的空间分成许多逻辑段,各个段之间可以重叠
    • 逻辑地址 = 段基地址:段内偏移地址
    • 物理地址(20位) = 段地址(16位)* 16(4位) + 偏移地址(16位)
    • 所以引出了段的概念,16位地址的寻址能力为64kb,所以段的最大长度为2^16=64KB,段地址低四位为0000B。
    • 这样,每个存储单元除了唯一的一个物理地址外,还有多个逻辑地址

解释与编译!

语言处理的两种类型:解释与编译

解释:

每一行代码进入解释器,然后变成指令序列,然后执行
代码行1 -> 解释器-> 指令序列1-> 执行

代码行2 -> 解释器-> 指令序列2-> 执行

代码行3 -> 解释器-> 指令序列3-> 执行

编译:

代码全部编译,形成完整指令序列后,执行。
所有代码行 -> 编译器-> 完整指令序列 -> 执行

区别:

执行速度:解释型语言<编译形语言

虚拟机!

为什么安卓程序不能在电脑运行:
所有程序本质都是指令序列,不同cpu指令集是不一样的。
安卓手机和电脑的指令集不一样。

为什么能在虚拟机上运行:
虚拟机本质上是用软件实现了指令集的翻译。
过程:安卓程序指令->安卓虚拟机->pc机指令->cpv
//电脑是pc指令集,每个游戏机都有自己的指令集。
//cpu核心是实行指令集的电路,所以指令集不一样,cpu不一样。

JAVA虚拟机!
java虚拟机与c语言的不同
c语言在不同平台上都可以运行,但是每个平台给c语言配备不一样的API。
c语言通过不同API进入不同平台后,是不同的编译器。所以移植困难。

C语言API1平台1编译器1
API2平台2编译器2
API3平台3编译器3

java是统一编译成一种代码(JVM虚拟机指令序列),进入不同平台的翻译机。不同平台只需要安装编译虚拟机即可。

JAVA统一编译JVM虚拟机指令序列翻译机1
翻译机2
翻译机3

//IR寄存器:cpu用来存指令的地方

软硬件逻辑等价的意义

许多功能可以直接由硬件实现,也可以在硬件支持下靠软件实现,对用户来说在功能上是等价的,所以称为功能上逻辑等价。

指令执行过程

  • 取指令与指令分析
  • 读取操作数
  • 运算
  • 后继指令地址

主存容量表示方法

法一:字节数
法二:单元数×位数
// 老师长得真可爱,像一个苹果

第二章

  • 原码,整数
  • 补码,整数
    • 补码数值范围n位对应-2n-1~2n-1-1
    • 补码最高位符号位:虽然形式与原码相同,都是用1表示负,但是这个1是通过mod2得到的,是数值的一部分,可以直接参与运算。
  • 浮点数转换!
    第一部分第二部分第三部分
    1位7位23位
    数符阶码尾数
    0正1负小数点移动位数+127小数点移动后的小数部分

步骤:
例子:7.625
1、将实数分解为二进制数
7.625 (10)= 111.101(2)

2、小数点移动到整数部分只有一个1(科学计数法)
111.101 = 1.11101×2^(2)

3、转化为数符,阶码,尾数(补0到23位)
数符 = 0
阶码 = 2+127 = 129 = 10000001
尾数 = 11101 00000 00000 00000 000

编码

  • 字符编码
    • ascii
    • unicode
  • 汉字编码
    • 汉字输入码
    • 汉字交换码
    • 汉字内部码

不可显示的控制字符:

  • 前32个和最后一个编码
  • 回车CR:0DH
  • 换行LF:0AH
  • 响铃BEL:07H

可显示和打印的字符:20H开始的95个编码

  • 数码0~9:30H~39H
  • 大写字母A~Z:41H~5AH
  • 小写字母a~z:61H~7AH
  • 空格:20H
  • 扩展ASCII码:最高D7位为1,表达制表符

基本寻址方式

8种基本寻址方式

问题

现需要为一套独立的单片机计算设备编写定长格式指令系统,已知该计算设备的计算芯片有8个寄存器,指令有32条,均为二地址指令,内存空间为256B,指令允许(寄存器,寄存器),(寄存器,内存),(内存,寄存器),(内存,内存)四种双地址,计算该套指令系统的每条指令至少需要多少个二进制位来表示。

32条指令:5位操作码
8个寄存器+内存空间256B:3位二进制数+8位二进制数(3要扩展到8位)
4种寻址方式:2位二进制数

所以:5+8×2+2 = 23位

第三章

CPU各功能组件:

  • 控制器:产生一系列控制信号,控制计算机中各部件完成取指令、分析指令、执行指令的操作
  • 算术逻辑部件ALU:实现指令所指定的各种逻辑或算数运算
  • 各种寄存器:存放指令、指令地址、操作数与运算结果
  • CPU内部总线:链接CPU内部各部件,维信息传送提供通路

指令分段执行过程P64:

  • 取指令
  • 分析分析
  • 执行指令
    • 读取操作数
    • 执行操作
    • 形成下一条指令地址

指令流水线,P69图3-8以及对应说明

  • 取指令
  • 译码指令
  • 计算机操作数地址
  • 去操作数
  • 执行指令
  • 写操作数

补码加减法运算和溢出判别P75-77

  • 加法运算
    • 两个二进制数的补码相加(包括最高位)
    • 最高位的进位直接舍去(即两个8位数相加,产生的第9位进位舍去)。
  • 减法运算
    • X-Y = X + (-Y)
    • -Y和Y的关系是:将Y的补码按位取反,得到的二进制数再加上1,就是-Y的补码。
  • 溢出问题(见例3-4 P76-77)
    • 溢出 != 最高位产生进位
    • 最高位产生进位不一定是溢出,溢出也不一定在最高位产生进位。
    • 溢出——指两个正数的补码相加,运算结果变成负数;或两个负数的补码相加,运算结果变为正数。看看两个二进制数补码相加得出的结果,转化为十进制数是什么,和原本十进制的运算结果是否符合。

四种情况下数据在内存与CPU内部的数据传送路径P88-89

  • 寄存器之间的数据传送
  • 主存数据传送到CPU
  • CPU数据传送到主存——数据送入MAR,主存接收地址送入MDR,然后开始传送。
  • 执行算数或逻辑

第四章:

通用寄存器和四个特殊寄存器的区别:
四个通用寄存器可以拆分成高八位和第八位
cx:循环次数
di,si:串处理

通用寄存器P126

数据寄存器:用来存放计算的结果操作数,也可存放地址

数据寄存器
AX累加器,使用频度最高,用于算术、逻辑运算以及与外设传送信息等;
BX基址寄存器,常用做存放存储器地址
CX计数器,作为循环和串操作等指令中的隐含计数器;
DX数据寄存器,常用来存放双字长数据的高16位,或存放外设端口地址。

变址寄存器:用于存储器寻址时提供地址(在串操作指令中有特殊用法)

变址寄存器
SI是源变址寄存器
DI是目的变址寄存器

指针寄存器:用于寻址内存堆栈内的数据(与SS堆栈段寄存器联合确定堆栈段中存储单元地址)

指针寄存器
SP为堆栈指针寄存器,指示栈顶的偏移地址,不能再用于其他目的,具有专用目的
BP为基址指针寄存器,表示数据在堆栈段中的基地址

段寄存器 P127 P132

段寄存器
CS指明代码段的起始地址(CS:IP指向下一条要执行的指令)
SS指明堆栈段的b起始地址(SS:SP操作堆栈顶的数据)
DS指明数据段的起始地址(DS:EA存取数据段中的数据)
ES指明附加段(附加数据段)的起始地址(ES:EA存取附加段中的数据)

IP寄存器

意义:
指令指针寄存器,用来存放代码段中的偏移地址。IP作为指令的地址指针,提供下一条指令的地址。IP寄存器用来控制指令序列的执行流程。

如何使指令连续执行:
当指令顺序执行,当CPU按照CS,IP合成的的指令地址从主存读取一条指令后,就自动修改IP的值,使IP内容为下一条指令的起始字节所在主存单元的偏移地址。
当程序执行时,当遇转移、转子指令时,就需要改变程序的执行指令。CPU执行这类指令时,若需转移,则将指令提供的转移地址的偏移地址送入IP,作为下一条指令地址的偏移地址。

FLAGS寄存器的意义P128-129

用于反映指令执行结果或者控制指令执行形式

image-20200707133010819

  • 状态标志:记录程序执行结果的状态信息

    • CF(进位标志):运算结果最高位进位(加法)借位(减法),CF=1,针对无符号数
    • AF(辅助进位标志):运算时D3位(低半字节)有进位或者借位,AF=1
    • ZF(零位标志):运算结果为0,则ZF=1
    • SF(符号标志):运算结果最高位为1,SF=1
    • PF(奇偶标志):运算结果中低八位中1的个数为0/偶数时,PF=1
    • OF(溢出标志):运算结果超出范围(例如8位表达的范围是+127~-128)则产生溢出,ZF=1,针对有符号数
  • 控制标志:可根据需要设置,控制指令执行方式

    • DF:DF置0,则串操作控制处理方向,从带有最低地址的第一个元素逐个处理,否则,从高向低
    • IF:IF=1,CPU允许中断,IF=0,则CPU关闭中断
    • TF:TF=1,机器进入单步工作方式,每条机器指令执行后,显示结果及寄存器状态,若TF=0,则机器处在连续工作方式。此标志为调试机器或调试程序发现故障而设置。

存储器

  • 存储单元的地址和内容的关系,P131,
    存储器里以字节为单位存储信息,每一字节单元给予唯一的编号(即存储器地址),成为物理地址。

  • 存储单元字节与物理地址的表示
    物理地址 = 真实的内存地址,和逻辑地址的关系是基地址左移4位,加上偏移地址。
    物理地址 = 基地址*10H + 偏移地址。
    所以,段地址寄存器DS和CS中存放的基地址,是真实数据段和代码段的起始地址除以10H。
    汇编指令中用的数据地址全部是偏移地址,计算机根据DS的值和指令中给出的偏移地址找到内存真实物理地址中的数据!而程序要执行下一条指令时,根据IP寄存器的偏移地址和CS寄存器中的基地址,找到下一条要执行的指令在内存中的位置并读入CPU。

  • 地址范围与总线宽度关系(第二段),
    8086的地址总线宽度为20位,所以可以访问的字节单元的地址范围为00000H~FFFFFH

  • 段寄存器与偏移地址组合关系,以及该组合指向的段内容。P133

    段寄存器偏移地址
    CSIP
    DSBX,SI,DI,一个16位数
    SSSP,BP
    ESDI

寻址方式的范例P141-147

  • 立即寻址方式和寄存器寻址方式
    • 立即寻址方式 MOV AL,5H
    • 寄存器寻址方式 MOV BL,AL
  • 储存器寻址方式
    • 直接寻址方式 MOV BX,DS:[1000H]
    • 寄存器间接寻址方式 MOV CH,[SI]
    • 寄存器相对寻址方式 MOV AX,[SI+10H]
    • 基址变址寻址方式 MOV AX,200H[BX][SI]
    • 比例编制寻址方式
    • 基址比例变址寻址方式
  • 串操作寻址方式

指令

MOV传送指令,注意后面所有指令要点均为格式、功能、受影响的标志位(即是否改变FLAGS寄存器中对应的位),以及注意事项P149
PUSH,POP指令 P149
ADD指令,ADC指令 P157-158,注意例4-30如何使用两个16位寄存器实现32位加法。
SUB指令,SBB指令,NEG指令,CMP指令 P160
MUL指令,DIV指令,要特别注意乘数/除数为8位和16位时被乘数、被除数的情况,注意积、商、余数存放的位置。P161-162
逻辑移位指令和算术移位指令,特别是算术右移指令P168-169
串操作指令:MOVS,CMPS,STOS,LODS的实现细节、关联寄存器,以及其与REP,REPE和REPNE的组合关系

思考题:

已知汇编语言的数据段载入内存中,起始物理地址是2000H,代码段载入内存中的起始物理地址是3000H。请问DS和CS的值分别是多少?
MOV AL,[10H] 是读取哪个内存单元的数据?
已知IP的值为100H,请问计算机下一条要执行的指令在内存的哪个单元?

段寄存器
段寄存器有CS,DS,SS,ES这四个,本学期仅要求理解CS和DS,即代码段寄存器和数据段寄存器,前面已经说过了,这两个寄存器是用来存放代码段起始地址/10H和数据段起始地址/10H的,所有汇编指令仅给出数据偏移地址,并根据DS定位数据基地址。
内存数据存储和读取的原则
第一章要点已经说到了,一个内存地址对应一个内存单元,而且一个内存单元只有8位,只能存放一个2位的十六进制数!那么比2位十六进制数长的,就需要两个以上内存单元来存。读取一个2位以上的十六进制数,也需要读取两个内存单元,那么这个存和读,就需要遵循高高低低的原则:
存数据的时候,低地址存低位数字,高地址存高位数字,从低到高2位2位的存。
读数据的时候,也是从低地址往高地址读,低地址读出来的值作为低位,高地址读出来的值作为高位。
存数据和读数据,到底存几个内存单元,读几个内存单元,由指令中另外一个寄存器或者变量的类型决定,8位寄存器或DB变量就只读/写一个内存单元,16位寄存器或DW变量读/写两个单元

乘除法指令
注意乘法指令MUL和除法指令DIV都只有一个操作数!被乘数/被除数根据指令给出操作数的类型决定。
如果操作数是8位寄存器或DB变量,乘法的被乘数为AL,结果放在AX中。除法的被除数是AX,商放AL,余数放AH。
如果操作数是16位寄存器或DW变量,乘法的被乘数为AX,结果放在DX(高16位)和AX(低16位)中。除法的被除数是DX高AX低组成的32位数,商放AX,余数放DX

思考题:假设AX=234H, BX=110H DX=0H请问若分别执行:
MUL BL后,AX=? BX=? DX=?
MUL BX后 AX=? BX=? DX=?
DIV BL 后,三个寄存器的值?
DIV BX 后,三个寄存器的值?

第五章

汇编语言的基本结构定义(数据段,代码段)P181-182

一个完整的汇编程序结构:
注意P182的代码,一个完整的汇编语言需要:

  • (1)定义数据段:
   DATA SEGMENT
    ………………….
   DATA ENDS
  • (2)堆栈段可以不定义
  • (3)定义代码段:
  CODE SEGMENT
       ASSUME   CS:CODE,DS:DATA 
START: mov AX,DATA
            mov DS,AX   初始化数据段基地址
            ……………
            MOV AH,4C
            INT 21H 调用系统函数退出程序
    CODE ENDS
    END START

变量的定义与变量的三个属性P185-186

变量定义后在内存中的存储方式 P186
数值表达式与字符串定义部分,注意要懂得画出变量在内存中的存储图,结合汇编语言作业第2题

变量的使用方式P188

标号的概念与三个属性P188-189

段寄存器的装载 P197-199

顺序程序 P212-213两个程序

分支程序转移条件P216

  1. 无条件跳转:
    JMP ;无条件跳转
  2. 根据 EFLAGS寄存器的PSW标志位跳转
  • JE ;等于则跳转 同JZ
  • JNE ;不等于则跳转 同JNZ
  • JA ;无符号大于则跳转
  • JAE ;无符号大于等于则跳转 同JNB
  • JB ;无符号小于则跳转
  • JBE ;无符号小于等于则跳转 同JNA
  • JG ;有符号大于则跳转
  • JGE ;有符号大于等于则跳转 同JNL
  • JL ;有符号小于则跳转
  • JLE ;有符号小于等于则跳转 同JNG

无条件转移指令JMP:无需任何条件,直接跳转到标号所在位置,通常用于处理不同分支,防止一个分支执行完后继续执行下一个分支:

   L1:…………
            ………… //if ……
        JMP end  //思考题:如果没有这一句会怎么样?
   L2:  …………
          ……………//else
  end:…………. //if….else……之后的语句

CMP指令与条件转移语句的结合:条件转移语句的工作原理,是以上一条指令的执行结果作为条件,从而决定是否转移到标号所在的指令取执行,因此条件转移指令的上一条指令通常是CMP指令,即比较指令。

     JE L1    (如AX与BX相等,转移到L1所在指令执行,否则继续向下执行)
    JA/JAE/JB/JBE L1(如AX大于/大于等于/小于/小于等于BX(作为无符号数),则转移到L1所在指令执行,否则继续向下执行)
    JG/JGE/JL/JLE L1 (如AX大于/大于等于/小于/小于等于BX(作为有符号数),则转移到L1所在指令执行,否则继续向下执行)
思考题:实现以下函数:

B =
4*A (A>=0)
-A (A<0)

实现时注意两个要点:

  1. 比较大小后的条件判断语句应该使用JG/JGE/JL/JLE而不应该使用JAE,JBE等(因为只有有符号数才有正数负数之分)
  2. 求相反数的指令是NEG
  3. 注意两个分支之间应该用一个JMP指令,防止一个分支执行完后继续向下执行下一个分支。

P217-219,分支程序例题

LOOP,LOOPE,LOOPNE指令用法与课本例题

无条件循环

循环程序设计:
LOOP语句基本使用方法:

标号: …………..
          …………..
          …………..
          LOOP 标号

程序即在标号与LOOP 语句之间循环,循环次数为CX的值。即LOOP每执行一次,CX减1,直至CX为0时停止循环。故若无特殊必要,不要在循环体中使用CX

带条件循环

LOOPE:用于找字符串中的某个字符。

标号:……………..
            ………………
            CMP ……….
            LOOPE 标号

循环条件:

  1. CX不为0,且每循环一次CX减1,与LOOP相同
  2. CMP语句执行的结果为相等

思考题:例5-8 P223-224,请掌握通过LOOPE在字符串中寻找不满足条件的字符的用法,注意如何使用寄存器寻址实现扫描字符串

用条件控制循环例题 P228,注意例题是如何使用JMP实现满足特定条件时终止循环的

子程序的具体定义方法 P233, CALL与RET的实际工作(段内调用)P230

  1. 数据段定义变量后在内存中的存放形式:
    重点1 、要求掌握变量类型:DB和DW
    DB:占用一个字节,定义2位16进制数
    DW:占用两个字节,定义4位16进制数
    定义字符串:仅使用DB来定义,每一个字符(包括空格)占用一个字节
    DW型数据存放和访问遵循高高低低的原则(忘了回去看前面的要点),连续定义的变量,在内存中连续存放。

汇编语言中变量的本质:变量名真正的意义是内存单元的一个“标签”,它具有两个属性:
地址属性:变量名本身代表着一个内存地址,而不是内存中的数据。注意:是偏移地址而不是物理地址。
类型属性:通过变量名去访问内存,访问的内存单元数和变量类型一致,即使用变量A去取内存的数,取一个单元,使用变量B,则取两个单元
MOV AL, A AL = 11H
MOV AL, A+1 AL = 34H
MOV AL, A+4 AL = 02H
MOV AL, C+1 AL = 02H
MOV AX, B AX = 1234H
MOV AX, B+1 AX = 1312H
思考题:想想为什么是这些结果?理解使用变量名来访问内存的方法。注意不同变量类型对应不同大小的寄存器。

第六章

多级存储架构不同层次存储器的特点P253

  • 内部存储器:容量小,存取速度快
  • 外部寄存器:容量大,速度慢,CPU不能直接访问
  • 高速缓冲寄存器:位于主存与CPU之间,容量小,速度快

存储器的位扩展与字数扩展P264

  • 位扩展
    对字长进行扩展。地址线增加。
  • 字数扩展
    增加储存字的数量。数据线增加。

Cache的工作原理(局部性)P276-277

对局部范围的存储器地址频繁访问,而对此范围外的地址访问很少的现象称为程序访问的局部性。

Cache三种映像方式 P277-279

  • 直接映像
    • 实现容易,但不够灵活
  • 全相连映像
    • 映像关系比较灵活,但不能直接从主存地址码中提取Cache块号,需将主存标记与Cache各块的标记逐个比较,直到找到标记符合的块为止。
  • 组相连映像
    • 映像方式灵活

替换算法 P280

  • 先进先出算法
  • 近期最少使用算法

Cache读写过程P280

  • 写回法
  • 写直达法

虚拟存储器的工作原理P299

三种虚拟存储器的特点P299-301

第七章

I/O接口的部分功能P308-309
程序查询方式工作原理P314 缺陷P316
向量中断法,中断入口地址生成 P320-321
中断的过程 P322-323,重点是中断响应与中断返回的具体工作
DMA方式 P335
通道与IOP的概念P347-348

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值