合工大22年汇编实验一(代码仅供参考,自己多思考)

实验一 基本汇编程序设计

  1. 实验目的

1、熟悉DEBUG程序中的命令,学会在DEBUG下调试、运行汇编语言源程序的方法。

2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程;

3、熟悉debug调式程序的基本方法;

4、掌握基本汇编语言程序设计方法。

  1. 实验内容

1、利用DEBUG程序中的“E”命令,将两个多字节数“12345678H”和“FEDCBA98H”分别送入起始地址为DS:0200H和DS:0204H两个单元中;实现将DS:0200H单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。

2、X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。试编写汇编语言程序完成以下功能:计算表达式值(V–(X*Y+Z-720))/X,将运算结果整数放在SUM1单元,余数放在SUM2单元。

实验提示(参考第3章和Debug部分的PPT):

(1) 在DOSBOX编译链接成可执行文件后,使用Debug装入内存。

(2) 使用U命令反汇编代码,并与源文件比对,需要注意数据段名、变量转入内存后的形式。

(3) 分别在G命令执行前后,使用D命令查看各个变量的值。

3、BL中的只有一位为0,编写程序测试0所在的位数(从左编号,最左边为第0位),并输出提示信息“The X Bit is 0”(X为0、1、2、3…7),要求使用地址表方法实现。

实验提示:从本实验开始,除非需要调试程序,不得再使用Debug方式执行程序;直接在DosBox下输入可执行程序名运行程序,获取结果。

4、在内存Score缓冲区中存放有100个学生的成绩数据,为无符号字节数。设 计程序完成如下功能:根据用户输入的一个2位十进制数,作为查找对象,在该数组中查找,若找到则显示“Y”,若没找到则显示“N”。

  1. 实验过程和程序

  1. 利用DEBUG程序中的“E”命令,将两个多字节数“12345678H”和“FEDCBA98H”分别送入起始地址为DS:0200H和DS:0204H两个单元中;实现将DS:0200H单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。

-E DS:0200 78 56 34 12 98 BA DC FE
-A
MOV AX,[200]
ADD AX,[204]
MOV BX,[202]
ADC BX,[206]
MOV [208],AX
MOV [20A],BX
G=100 116

2、X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。试编写汇编语言程序完成以下功能:计算表达式值(V–(X*Y+Z-720))/X,将运算结果整数放在SUM1单元,余数放在SUM2单元。

实验提示(参考第3章和Debug部分的PPT):

(1) 在DOSBOX编译链接成可执行文件后,使用Debug装入内存。

STACK SEGMENT STACK
    DW 512 DUP(?)
STACK ENDS
DATA SEGMENT
    X DW 3
    Y DW 123
    Z DW 82
    V DW 20
    SUM1 DW ?
    SUM2 DW ?
DATA ENDS
CODE SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:STACK
        START:    MOV AX,DATA
            MOV DS,AX        

            MOV AX,X    ;将X中的数据放入AX中
            MOV BX,Y    

            IMUL BX        ;X*Y

            MOV CX,AX
            MOV BX,DX    ;保存x*y到BX:CX中

            MOV AX,Z
            CWD        ;拓展寄存器DX
            ADD AX,CX    ;X*Y+Z
            ADC DX,BX    ;加上进位

            SUB AX,720    ;X*Y+Z-720
            SBB DX,0    ;减去借位

            MOV CX,AX
            MOV BX,DX    ;保存X*Y+Z-720到BX:CX中

            MOV AX,V
            CWD
            SUB AX,CX    ;V-(X*Y+Z-720)
            SBB DX,0    ;减去借位

            MOV BX,X
            IDIV BX        ;V-(X*Y+Z-720)
            MOV SUM1,AX    ;商
            MOV SUM2,DX    ;余数

            MOV AX,4C00H
            INT 21H
        CODE ENDS
    END START

(2) 使用U命令反汇编代码,并与源文件比对,需要注意数据段名、变量转入内存后的形式。

(3) 分别在G命令执行前后,使用D命令查看各个变量的值。

3、BL中的只有一位为0,编写程序测试0所在的位数(从左编号,最左边为第0位),并输出提示信息“The X Bit is 0”(X为0、1、2、3…7),要求使用地址表方法实现。

实验提示:从本实验开始,除非需要调试程序,不得再使用Debug方式执行程序;直接在DosBox下输入可执行程序名运行程序,获取结果。

STACK SEGMENT STACK
    DW 512(?)
STACK ENDS
DATA SEGMENT
    STR    DW L0,L1,L2,L3,L4,L5,L6,L7    ;地址表
    S0    DB 'The 0 Bit is 0$'
    S1    DB 'The 1 Bit is 0$'
    S2    DB 'The 2 Bit is 0$'
    S3    DB 'The 3 Bit is 0$'
    S4    DB 'The 4 Bit is 0$'
    S5    DB 'The 5 Bit is 0$'
    S6    DB 'The 6 Bit is 0$'
    S7    DB 'The 7 Bit is 0$'
DATA ENDS
CODE SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:STACK
START:
    MOV AX,DATA
    MOV DS,AX
    MOV BL,11111110B    ;待测试的数据,从左往右第7位是0
    MOV CX,8
    MOV AL,BL
    MOV BX,0
AGAIN:
    SHL AL,1
    JNC GET        ;当cf = 0,就是找到了唯一的0位,跳出循环
    INC BX
    LOOP AGAIN
    JMP DOWN    ;如果程序到这里说明没有找到0位,程序直接结束

GET:
    SHL BX,1
    JMP STR[BX]
L0:    MOV DX,OFFSET S0
    JMP SHOW
L1:    MOV DX,OFFSET S1
    JMP SHOW
L2:    MOV DX,OFFSET S2
    JMP SHOW
L3:    MOV DX,OFFSET S3
    JMP SHOW
L4:    MOV DX,OFFSET S4
    JMP SHOW
L5:    MOV DX,OFFSET S5
    JMP SHOW
L6:    MOV DX,OFFSET S6
    JMP SHOW
L7:    MOV DX,OFFSET S7
    JMP SHOW
SHOW:
    MOV AH,09H
    INT 21H

DOWN:
    MOV AX,4C00H
    INT 21H
CODE ENDS
    END START

4、在内存Score缓冲区中存放有100个学生的成绩数据,为无符号字节数。设 计程序完成如下功能:根据用户输入的一个2位十进制数,作为查找对象,在该数组中查找,若找到则显示“Y”,若没找到则显示“N”。

STACK SEGMENT STACK
    DW 512(?)
STACK ENDS
DATA SEGMENT
    SCORE DB 10 DUP(0,10,20,30,40,50,60,70,80,90)    ;为了程序方便,以十组一样的数据存在内存中代替一百个学生的成绩
DATA ENDS
CODE SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:STACK
START:
    MOV AX,DATA
    MOV DS,AX
    LEA BX,SCORE    ;拿到成绩数据首地址
    MOV CX,100    ;循环100次,遍历所有学生成绩
    MOV SI,0


    MOV AH,01H    ;输入一个字符,表示十位
    INT 21H
    AND AX,000FH
    
    MOV DL,10
    MUL DL    
    MOV DL,AL    ;保存AL

    MOV AH,01H    ;输入一个字符,表示个位
    INT 21H        
    AND AX,000FH
    ADD AL,DL    ;将输入成绩保存在DH中
    MOV DH,AL

    MOV AH,2
    MOV DL,10    ;回车
    INT 21H

    MOV AH,2
    MOV DL,13    ;换行
    INT 21H

AGAIN:    
    MOV DL,[BX+SI]
    CMP DH,DL
    JE DOWN
    INC SI
    LOOP AGAIN

    MOV DL,'N'
    JMP SHOW    ;运行到这里说明找不到对应的学生
    
DOWN:
    MOV DL,'Y'


SHOW:    MOV AH,02
    INT 21H

    MOV AX,4C00H
    INT 21H
CODE ENDS
    END START

你可能感兴趣的:(汇编)