三、顺序结构程序实验(1)
3.1 实验类型
类型:设计型实验
3.2 实验目的:
1、掌握一个完整的汇编程序上机的过程;
2、熟练掌握DEBUG的使用方法。
3.3 实验题目:
编写程序,将2个立即数存入堆栈,然后取出,计算它们的和或者差。
3.4 实验结果:
1.编辑一个扩展文件名为ASM的汇编语言源程序。
代码:
DATA SEGMENT
NUM1 DB 0 ;定义一个字节的NUM1并赋值为0
NUM2 DB 0 ;定义一个字节的NUM2并赋值为0
ms_input db 'Please input the first dec-number:','$'
xs_input db 'Please input the second dec-number:','$'
SUM_input db 'The sum number is:','$'
SUM DB 0 ;定义他们的和
DATA ENDS
STACK SEGMENT PARA STACK
dw 0,0,0,0
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV dx,OFFSET ms_input ;取显示字符串首地址
mov ah,9
int 21h
CALL DISP_HUI
;输入第一个值把它保存在NUM1中
MOV AH,01H
INT 21H
SUB AL,30H ;将键盘输入的ASCII码转换成16进制的0到9
MOV NUM1,AL ;将值赋给NUM1
;输入一个值后自动回车加换行并等待输入第二个数
MOV DL,0AH ;回车
MOV AH,2
INT 21H
MOV DL ,0DH ;换行
MOV AH,2
INT 21H
MOV dx,OFFSET xs_input ;取显示字符串首地址
mov ah,9
int 21h
CALL DISP_HUI
;输入第二个值把它保存在NUM2中
MOV AH,01H
INT 21H
SUB AL,30H ;将键盘输入的ASCII码转换成16进制的0到9
MOV NUM2,AL ;将值赋给NUM2
;把两个值相加并保存在SUM中
ADD BL,NUM1
ADD BL,NUM2 ;把两个数相加存放在BL中
MOV SUM,BL ;把和赋给SUM
;为了输出在新的一行
MOV DL ,0AH ;回车
MOV AH,02H
INT 21H
MOV DL ,0DH ;换行
MOV AH,02H
INT 21H
MOV dx,OFFSET SUM_input ;取显示字符串首地址
mov ah,9
int 21h
CALL DISP_HUI
;以下为输出程序
CMP SUM,9 ;判断是否不在0-9以内
JA Y ;超过9则跳转
MOV DL,SUM ;若没有则将SUM的值给DL
ADD DL,30H ;需要在输出前转换到相应的ASCII码
JMP SHOW ;跳转到显示代码
;10-18
Y:
MOV DL,1 ;直接先输出十位上的值
ADD DL,30H ;需要在输出前转换到相应的ASCII码
MOV AH,02H
INT 21H
MOV DL,SUM ;先将SUM的值赋给DL
SUB DL,10 ;把DL中的值减十进置的10,如果减十六进制的10会有误
ADD DL,30H ;需要在输出前转换到相应的ASCII码
JMP SHOW
;显示程序
SHOW:
MOV AH,02H
INT 21H
;程序结束
MOV AH,4CH
INT 21H
DISP_HUI: ;入口参数DL,回车
PUSHF ;标志位入栈
PUSH AX
PUSH DX
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
POP DX
POP AX
POPF
RET
CODE ENDS
END START
2.用汇编程序MASM或TASM 汇编上述的汇编语言源程序,形成目标代码文件。(扩展名为OBJ)
3.用连接程序LINK 或TLINK连接目标代码文件,形成可执行文件。(扩展名为EXE)
4.运行可执行文件。观察执行结果,以验证其正确性。
四、顺序结构程序实验(2)
4.1 实验类型
实验类型:设计型
4.2 实验目的
1.学习数据传达指令和算术运算指令的用法;
2.熟练掌握DEBUG的使用方法;
3.能够编写简单的汇编语言程序,并上机调试。
4.3 实验题目
1.从键盘上输入0一9之间的任意一个数字,计算其平方值,并将结果在屏幕上显示出来。例如:从键盘输入5,则屏幕显示结果应为19H(或25)。
2.从键盘上接收两个一位十六进制数,求其乘积,并将结果在屏幕上显示出来。
4.3 实验要求
1.仔细阅读汇编语言教材相关内容;
2.熟练掌握DEBUG中的D、E、U、T命令;
3.掌握在DEBUG中如何找到数据段段基址的方法;
4.掌握单步跟踪程序执行的方法;
5.掌握键盘输入字符、显示字符的系统调用使用方法:
6.初步了解十进制数字与其对应的ASCIII码之间的相互转换方法;
7.初步了解十六进制数字与其对应的ASCII码之间的相互转换方法;
4.4 实验报告
1.总结DEBUG中E、D、T、U命令的功能;
(1)D命令:查看内存中的内容;
输入d:可以查看内存中的内容
输入d 段地址:偏移地址:查看特定位置的内存数据
输入d 段地址:起始偏移地址 结尾偏移地址:查看特定位置和特定范围的内存数据
输入d 偏移地址、 d 起始偏移地址 结尾偏移地址:会将DS的内容作为段地
(2)E命令:改写内存中的内容;
输入e 段地址:偏移地址 数据串修改特定位置的内存数据:
输入e 段地址:偏移地址后按Enter也可以修改特定位置的内存数据,数据之间用空格隔开:
(3)U命令:将内存中的机器指令翻译成汇编指令:
输入u、u 段地址:偏移地址可以将内存中的内容翻译为对应的汇编指令:
(4)T命令:执行一条机器指令;
使用T 指令 执行内存地址为【CS寄存器数值:IP寄存器数据】位置的指令
ax寄存器原始数据为0000,修改cs:ip = 1000:100后,在cs:ip 写入 “MOV AX , 1”的机器码,使用t命令执行后,ax寄存器数据被修改为0001
继续输入t ,则继续执行命令
2.写出程序清单,并记录执行结果;
(1)第一个题目:
从键盘上输入0一9之间的任意一个数字,计算其平方值,并将结果在屏幕上显示出来
代码:
DATA SEGMENT
INPUT DB 'Please input a dec-number(0-9):','$'
OUTPUT DB 'The square value is:','$'
TABLE DB 0,1,4,9,16,25,36,49,64,81
num1 DB ?
num2 DB ?
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP (?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV DS,AX ;把AX的内容传到DS
MOV AH,9 ;执行命令9
LEA DX,INPUT ;将INPUT的地址传到DX
INT 21H ;中断调用显示input的字符串
MOV AH,1 ;键盘输入数字功能调用
INT 21H ;中断调用读入键值,并显示该字符
AND AL,0FH ;将AL中输入的数字ASIⅡ码转为原来的十进制数字
MOV num1,AL ;取AL已转为十进制的数字给num1(输入值)
MOV BX,OFFSET TABLE ;取了TABLE的偏移地址给BX
MOV AH,0 ;对AH清零
MOV AL,num1 ;把num1的数给AL
ADD BX,AX ;BX与AX相加
MOV AL,[BX] ;把以BX为偏移地址的值赋给AL
MOV num2,AL ;将BX的内容赋给num2(平方值)
MOV AH,2 ;执行命令2
MOV DX,0AH ;换行
INT 21H
MOV AH,9 ;执行命令9
LEA DX,OUTPUT ;将OUTPUT的地址传到DX
INT 21H ;显示结果提示字符串
MOV CL,10 ;除数10
MOV AL,num2 ;把num2存的数传给AL以做除法运算
MOV AH,0 ;高位清零
DIV CL ;除法运算,商存在AL中
ADD AL,48 ;转ASCII码,显示结果对应字符
MOV DL,AL ;把已转成对应字符的ASCII码传到DL准备显示
MOV CL,AH ;把余数即个位数传给CL
MOV AH,2 ;执行命令2
INT 21H ;中断调用显示十位数
MOV AH,2 ;执行命令2
ADD CL,48 ;转ASCII码,显示结果对应字符
MOV DL,CL ;把已转成对应字符的ASCII码传到DL准备显示
INT 21H ;终端调用显示十位数
MOV AH,4CH
INT 21H
CODE ENDS
END START
运行截图:
(2)第二个题目:
从键盘上接收两个一位十六进制数,求其乘积,并将结果在屏幕上显示出来。
代码:
DATA SEGMENT
NUM1 DB 0 ;定义一个字节的NUM1并赋值为0
NUM2 DB 0 ;定义一个字节的NUM2并赋值为0
ms_input db 'Please input the first number:','$'
xs_input db 'Please input the second number:','$'
output db 'The NUM1*NUM2 is:','$'
Product DB 0 ;定义他们的积
DATA ENDS
STACK SEGMENT PARA STACK
BUF DW 20H DUP (0)
LEN EQU $-BUF
STACK ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATA,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV DX,OFFSET MS_INPUT ;取显示字符串首地址
MOV AH,9
INT 21H
CALL DISP_HUI
MOV AH,01H ;输入第一个数
INT 21H
CALL DISP_HUI
MOV BL,AL
MOV DX,OFFSET xs_INPUT ;取显示字符串首地址
MOV AH,9
INT 21H
CALL DISP_HUI
MOV AH,01H ;输入第二个数
INT 21H
CMP BL,'9' ;判断是1-9还是A-F
JA NE1
SUB BL,'0'
S:
CMP AL,'9'
JA NE2
SUB AL,'0'
JMP MU
NE1:
SUB BL,'A' ;对A-F处理
ADD BL,10
JMP S
NE2:
SUB AL,'A' ;对A-F处理
ADD AL,10
MU:
CALL DISP_HUI
MOV DX,OFFSET OUTPUT ;取显示字符串首地址
MOV AH,9
INT 21H
CALL DISP_HUI
MUL BL
MOV BL,AL ;结果放在AL中
AND AL,0FH
MOV CL,4
SHR BL,CL ;把AL中的八个二进制位分开
CMP BL,9 ;转换成ASII码输出(1-9和A-F)
JA N1
ADD BL,'0'
JMP N2
N1:
ADD BL,37H
N2:
CMP AL,9
JA N3
ADD AL,'0'
JMP N4
N3:
ADD AL,37H
N4:
MOV CL,AL
MOV DL,BL ;输出高位
MOV AH,2
INT 21H
MOV DL,CL ;输出低位
MOV AH,2
INT 21H
MOV AX,4C00H
INT 21H
DISP_HUI: ;入口参数DL,回车
PUSHF ;标志位入栈
PUSH AX
PUSH DX
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
POP DX
POP AX
POPF
RET
CODES ENDS
END START
运行截图:
2x3=06 2xA=14
3.说明十六进制数转换为ASCII码的方法;
要把一个字节单元中的两位十六进制数字转换成ASCII码,需要先分离这两个数字,即把高4位和低4位分开然后转换成各自的ASCII码。转换时,按0-9和A-F两种不同的情况,采用分支,分别处理,0-9的数字,加30H,而A-F的数字,加37H。
4.说明0-99之间的二进制数转换为十进制数的ASCII码的方法。
每位上的数分别乘以2的某次方(位权),最后相加。其中次方数根据如下根则确定:
从个位起,整数右到左,0开始依次递增1,小数左到右,-1开始依次递减1