Files
Operating-System/Experiment/asm-exp/实验二/实验二_实验报告.md
2026-06-25 00:09:09 +08:00

505 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 实验二:顺序程序设计
## 一、实验名称
顺序程序设计
## 二、实验目的
1. 掌握数据传送指令MOV的使用方法
2. 掌握算术运算指令ADD、SUB、MUL的使用方法
3. 掌握逻辑运算指令AND、OR的使用方法
4. 理解拆字程序的设计原理
5. 熟悉顺序程序的基本结构
## 三、实验内容
### 3.1 基础性实验
#### 1数据传送和加法运算
**实验要求**设X=25HY=30H计算Z=X+Y
**程序说明**
| 指令 | 功能 |
|------|------|
| MOV AL, 25H | 将25H传送到ALX=25H |
| MOV BL, 30H | 将30H传送到BLY=30H |
| ADD AL, BL | AL = AL + BL = 55H |
| MOV Z, AL | 将结果55H存入Z |
#### 2多字节加法运算
**实验要求**实现32位数据加法12345678H + 87654321H
**程序说明**
| 指令 | 功能 |
|------|------|
| MOV AX, 5678H | 被加数低16位 |
| MOV DX, 1234H | 被加数高16位 |
| MOV CX, 4321H | 加数低16位 |
| MOV BX, 8765H | 加数高16位 |
| ADD AX, CX | 低16位相加 |
| ADC DX, BX | 高16位带进位相加 |
#### 3拆字程序
**实验要求**将16位数ABCDH拆分为两个8位数
**程序说明**
| 指令 | 功能 |
|------|------|
| MOV AX, 0ABCDH | 16位数据送入AX |
| MOV DL, AL | 保存低8位CDH到DL |
| MOV CL, 8 | 设置移位计数 |
| SHR AH, CL | AH右移8位得高8位ABH |
| MOV BH, AH | 高8位ABH存入BH |
| MOV BL, DL | 低8位CDH存入BL |
### 3.2 加强性实验
#### 18位×8位乘法运算
**实验要求**实现8位×8位乘法12H × 34H
**程序说明**
| 指令 | 功能 |
|------|------|
| MOV AL, 12H | 被乘数12H送入AL |
| MOV BL, 34H | 乘数34H送入BL |
| MUL BL | AX = AL × BL = 0D68H |
#### 2多字节减法运算
**实验要求**实现16位减法9876H - 1234H
**程序说明**
| 指令 | 功能 |
|------|------|
| MOV AX, 9876H | 被减数送入AX |
| MOV BX, 1234H | 减数送入BX |
| SUB AX, BX | AX = AX - BX = 8642H |
#### 3逻辑运算AND和OR
**实验要求**对55H分别进行AND和OR运算
**程序说明**
| 指令 | 功能 |
|------|------|
| MOV AL, 55H | AL = 55H (01010101B) |
| AND AL, 0FH | AL = 55H AND 0FH = 05H |
| MOV BL, AL | 保存AND结果到BL |
| MOV AL, 55H | 恢复AL = 55H |
| OR AL, 0F0H | AL = 55H OR F0H = F5H |
## 四、实验步骤
### 4.1 基础性实验步骤
#### 实验1数据传送和加法运算
1. 进入DOS环境加载DEBUG程序
2. 使用A命令输入以下程序
```
-a 100
-mov al, 25
-mov bl, 30
-add al, bl
-mov [110], al
-int 20
```
3. 使用E命令在100:110处设置变量Z的存储空间
```
-e 110:0
```
4. 使用G命令执行程序
```
-g=100
```
5. 使用D命令查看结果
```
-d 110:0 110:0
```
#### 实验2多字节加法运算
1. 进入DEBUG环境
2. 使用A命令输入32位加法程序
3. 执行程序并验证结果DX:AX = 99999999H
#### 实验3拆字程序
1. 进入DEBUG环境
2. 使用A命令输入拆字程序
3. 执行程序观察BH和BL的值
### 4.2 加强性实验步骤
#### 实验1乘法运算
1. 进入DEBUG环境
2. 使用A命令输入乘法程序
3. 执行程序验证AX=0D68H
#### 实验2减法运算
1. 进入DEBUG环境
2. 使用A命令输入减法程序
3. 执行程序验证AX=8642H
#### 实验3逻辑运算
1. 进入DEBUG环境
2. 使用A命令输入逻辑运算程序
3. 执行程序验证BL=05HAL=F5H
## 五、程序代码
### 5.1 基础性实验程序代码
#### 实验1数据传送和加法运算
```assembly
; 实验二基础性实验一:数据传送和加法运算
; 程序功能X=25H, Y=30H, Z=X+Y
; 计算25H + 30H = 55H结果存入Z
CODE SEGMENT
ASSUME CS:CODE
ORG 100H ; 程序装入地址
START:
MOV AL, 25H ; X=25H传送到AL
MOV BL, 30H ; Y=30H传送到BL
ADD AL, BL ; AL = AL + BL = 25H + 30H = 55H
MOV Z, AL ; 结果55H存入Z
INT 20 ; 退出程序
Z DB ? ; 定义变量Z
CODE ENDS
END START
```
#### 实验2多字节加法运算
```assembly
; 实验二基础性实验二:多字节加法运算
; 程序功能实现32位数据加法
; 被加数12345678H加数87654321H结果存入指定内存
CODE SEGMENT
ASSUME CS:CODE
ORG 100H
START:
MOV AX, 5678H ; 被加数低16位
MOV DX, 1234H ; 被加数高16位
MOV CX, 4321H ; 加数低16位
MOV BX, 8765H ; 加数高16位
ADD AX, CX ; 低16位相加
ADC DX, BX ; 高16位带进位相加
; 结果DX:AX = 99999999H
INT 20
CODE ENDS
END START
```
#### 实验3拆字程序
```assembly
; 实验二基础性实验三:拆字程序
; 程序功能将16位数拆分为两个8位数
; 原始数据ABCDH拆分后高8位=ABH低8位=CDH
CODE SEGMENT
ASSUME CS:CODE
ORG 100H
START:
MOV AX, 0ABCDH ; 16位数据AX=ABCDH
MOV DL, AL ; 将AL(低8位)传给DL保存
MOV CL, 8 ; 设置移位计数
SHR AH, CL ; AH右移8位得到高8位ABH
MOV BH, AH ; 高8位存入BH
MOV BL, DL ; 低8位CDH存入BL
; 结果BH=ABH(高8位), BL=CDH(低8位)
INT 20
CODE ENDS
END START
```
### 5.2 加强性实验程序代码
#### 实验18位×8位乘法运算
```assembly
; 实验二加强性实验一8位×8位乘法运算
; 程序功能实现8位×8位乘法
; 被乘数12H乘数34H结果存入16位变量
CODE SEGMENT
ASSUME CS:CODE
ORG 100H
START:
MOV AL, 12H ; 被乘数12H存入AL
MOV BL, 34H ; 乘数34H存入BL
MUL BL ; AX = AL * BL = 12H * 34H = 0D68H
; 结果AX=0D68H16位乘积
INT 20
CODE ENDS
END START
```
#### 实验2多字节减法运算
```assembly
; 实验二加强性实验二:多字节减法运算
; 程序功能实现16位减法运算
; 被减数9876H减数1234H结果=8642H
CODE SEGMENT
ASSUME CS:CODE
ORG 100H
START:
MOV AX, 9876H ; 被减数AX=9876H
MOV BX, 1234H ; 减数BX=1234H
SUB AX, BX ; AX = AX - BX = 9876H - 1234H = 8642H
; 结果AX=8642H
INT 20
CODE ENDS
END START
```
#### 实验3逻辑运算AND和OR
```assembly
; 实验二加强性实验三逻辑运算AND和OR
; 程序功能实现AND和OR逻辑运算
; 数据AL=55H进行AND和OR运算
CODE SEGMENT
ASSUME CS:CODE
ORG 100H
START:
MOV AL, 55H ; AL=55H (01010101B)
AND AL, 0FH ; AL = AL AND 0FH = 55H AND 0FH = 05H
; 此时AL=05H (低4位保留高4位清零)
MOV BL, AL ; 保存AND结果到BL
MOV AL, 55H ; 恢复AL=55H
OR AL, 0F0H ; AL = AL OR 0F0H = 55H OR F0H = F5H
; 此时AL=F5H (高4位置1低4位不变)
; 结果BL=05H(AND结果), AL=F5H(OR结果)
INT 20
CODE ENDS
END START
```
## 六、实验结果
### 6.1 基础性实验结果
#### 实验1数据传送和加法运算结果
【此处需要截图】
截图应包含:
- 程序输入过程
- 执行T命令单步执行观察AL=25H
- 执行T命令单步执行观察BL=30H
- 执行ADD指令后AL=55H
- 执行后内存110处值为55H
预期结果Z = 55H
#### 实验2多字节加法运算结果
【此处需要截图】
截图应包含:
- 执行前DX:AX = 1234:5678
- 执行前CX:BX = 8765:4321
- 执行后DX:AX = 9999:9999
预期结果12345678H + 87654321H = 99999999H
#### 实验3拆字程序结果
【此处需要截图】
截图应包含:
- 执行前AX = ABCDH
- 执行后BH = ABHBL = CDH
预期结果高8位 = ABH低8位 = CDH
### 6.2 加强性实验结果
#### 实验1乘法运算结果
【此处需要截图】
截图应包含:
- 执行前AL = 12HBL = 34H
- 执行后AX = 0D68H
预期结果12H × 34H = 0D68H即十进制3428
#### 实验2减法运算结果
【此处需要截图】
截图应包含:
- 执行前AX = 9876HBX = 1234H
- 执行后AX = 8642H
预期结果9876H - 1234H = 8642H
#### 实验3逻辑运算结果
【此处需要截图】
截图应包含:
- 55H AND 0FH = 05HBL=05H
- 55H OR 0F0H = F5HAL=F5H
### 6.3 实验数据记录表
**基础性实验数据记录**
| 实验 | 输入数据 | 操作 | 结果 |
|------|----------|------|------|
| 实验1 | X=25H, Y=30H | X+Y | Z=55H |
| 实验2 | 12345678H + 87654321H | 32位加法 | 99999999H |
| 实验3 | AX=ABCDH | 拆字 | BH=ABH, BL=CDH |
**加强性实验数据记录**
| 实验 | 输入数据 | 操作 | 结果 |
|------|----------|------|------|
| 实验1 | AL=12H, BL=34H | 8位×8位乘法 | AX=0D68H |
| 实验2 | AX=9876H, BX=1234H | 16位减法 | AX=8642H |
| 实验3 | AL=55H | AND 0FH | AL=05H |
| 实验3 | AL=55H | OR 0F0H | AL=F5H |
## 七、思考题
### 7.1 基础性实验思考题
#### 思考题一在数据传送指令中MOV指令和XCHG指令有什么区别
**答**
- MOV指令将源操作数的数据传送到目的操作数执行后源操作数内容不变
- XCHG指令交换两个操作数的内容执行后两个操作数的内容互相交换
例如:
```
MOV AL, BL ; 将BL的内容复制到ALBL内容不变
XCHG AL, BL ; 将AL和BL的内容互换
```
#### 思考题二在多字节加法运算中为什么要使用ADC指令而不是ADD指令
**答**
在多字节多字加法运算中低位相加可能产生进位。如果低位用ADD指令高位必须用ADCAdd with Carry指令来加上低位产生的进位否则会丢失数据。
例如32位加法
- `ADD AX, CX` 计算低16位可能产生CF进位标志
- `ADC DX, BX` 计算高16位同时加上低位产生的进位
#### 思考题三拆字程序中SHR指令的作用是什么还有什么方法可以实现拆字
**答**
SHRShift Right指令将目的操作数右移指定的位数。本程序中`SHR AH, CL`将AH右移8位相当于把AH的高8位移到低8位原高8位变为0从而得到高8位数据。
其他拆字方法:
1. 使用MASK操作`MOV BH, AH AND 0F0H`然后右移4位
2. 使用`MOV BH, AH`和`AND BH, 0F0H`
3. 使用`ROL AX, 8`将高8位旋转到低8位
### 7.2 加强性实验思考题
#### 思考题一MUL指令执行后结果放在哪里什么时候需要扩展被乘数
**答**
- 8位×8位乘法结果放在AX16位
- 16位×16位乘法结果放在DX:AX32位
- 32位×32位乘法结果放在EDX:EAX64位
当被乘数放在AL/AX/EAX时需要扩展到高8/16/32位
- 被乘数是字节时隐含在AL中高8位为0
- 被乘数是字时隐含在AX中高16位为0
- 被乘数是双字时隐含在EAX中高32位为0
如果被乘数不是0扩展需要先将高位清零或设置正确的值。
#### 思考题二SUB指令和CMP指令有什么区别
**答**
- SUB指令执行减法并存储结果修改目的操作数
- CMP指令执行减法但不存储结果只影响标志位
CMP指令通常与条件跳转指令配合使用根据标志位判断条件。
例如:
```
CMP AX, BX ; AX - BX不存储结果只设置标志位
JE EQUAL ; 如果相等ZF=1则跳转
```
#### 思考题三AND指令和OR指令在执行时有什么特点它们如何影响标志位
**答**
AND和OR都是逻辑运算指令
**AND指令特点**
- 任何位与1相与保持不变
- 任何位与0相与结果为0
- 常用于清零特定位(掩码操作)
- 影响OF=0CF=0SF/ZF/PF根据结果设置
**OR指令特点**
- 任何位与0相或保持不变
- 任何位与1相或结果为1
- 常用于置1特定位
- 影响OF=0CF=0SF/ZF/PF根据结果设置
例如:
- `AND AL, 0FH` 将AL的高4位清零低4位保留
- `OR AL, 80H` 将AL的最高位置1
## 八、实验心得
1. 通过本次实验深刻理解了数据传送指令MOV和算术运算指令ADD、SUB、MUL的使用方法。
2. 顺序程序是最基本的程序结构,按照指令顺序依次执行,理解了其执行流程。
3. 多字节加法运算需要考虑进位问题正确使用ADC指令是实现32位以上加法的关键。
4. 拆字程序展示了移位指令SHR的应用通过移位可以方便地分离高位和低位数据。
5. 乘法指令MUL的执行结果自动存放在AX或DX:AX中需要根据结果大小使用相应的寄存器。
6. 逻辑运算指令AND和OR可以用于位操作实现掩码和置位功能。
7. 通过实验掌握了DEBUG的使用方法为后续复杂的汇编程序调试打下基础。