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

12 KiB
Raw Permalink Blame History

实验二:顺序程序设计

一、实验名称

顺序程序设计

二、实验目的

  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数据传送和加法运算

; 实验二基础性实验一:数据传送和加法运算
; 程序功能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多字节加法运算

; 实验二基础性实验二:多字节加法运算
; 程序功能实现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拆字程序

; 实验二基础性实验三:拆字程序
; 程序功能将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位乘法运算

; 实验二加强性实验一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多字节减法运算

; 实验二加强性实验二:多字节减法运算
; 程序功能实现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

; 实验二加强性实验三逻辑运算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, AHAND 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的使用方法为后续复杂的汇编程序调试打下基础。