【西南科技大学汇编程序设计】顺序结构程序实验

三、顺序结构程序实验(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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值