一般来说,我贴上来的代码都是能直接跑的,如果不行可以邮箱交流1902946954@qq.com
仅供参考,微机的老师讲的很好,所以请还是要先自己完成咯。
免责声明,本人菜只因一只,内容仅供参考,错了不负责哈。
微机实验三
一、实验目的
1、熟悉80X86基本指令集。
2、掌握汇编语言源程序的编写方法:程序结构、返回DOS的方法、段地址的初始化、存储单元的访问等。
3、掌握常用的代码转换编程。
4、掌握汇编程序的DEBUG动态调试。
二、开发环境
汇编集成开发环境、debug
三、实验题目
实验1:码制转换:将字节数据转换为ASCII码表示的二进制数,并显示输出。字节数据的值域为0~255,可转换为八位二进制数。例如:字节数据为79h,则转换为:‘01111001’
1.源代码:
datas segment
org 2000h
num db 79H
org 2010h
res db 8 dup(?),'$'
datas ends
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
;代码段
MOV BL,[num] ;将数据移入寄存器
MOV CL,8 ;左移次数为8次
MOV BH,00000001B ;清除高七位
MOV SI,0 ;res的偏移
AGAIN:
ROL BL,1 ;循环左移
MOV CH,BL ;保护BL
AND CH,BH ;清空高七位
MOV AL,30H ;转换为ASCII码
ADD AL,CH
MOV res[SI],AL ;移入存储单元
INC SI
DEC CL
JNE AGAIN
MOV AX,SEG res ;屏幕显示字符串
MOV DS,AX
MOV DX,OFFSET res
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
2.运行截图
测试成功
3.修改数据段,再次测试
在数据段中放56H,测试
测试成功
实验二:码制转换:将字数据转换为ASCII码表示的十进制数,并显示输出。字数据的值域为0~65535,最多可转换为五位十进制数。例如:字数据为0ffffh,则转换为:‘65535’
1.源代码
datas segment
org 2000h
num dw 65535
org 2010h
res db 5 dup(?),'$'
datas ends
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV SI,0
MOV AX,[num]
MOV CX,10000
DIV CX;AX为6,DX为5535
ADD AX,30H;转为ASCII码
XCHG AX,DX;互换
MOV res[SI],DL
INC SI;得6
SUB DX,DX
MOV CX,1000
DIV CX
ADD AX,30H
XCHG AX,DX
MOV RES[SI],DL
INC SI;得5
MOV CL,100
DIV CL;此时已经是字节运算,商在AL,余数在AH
ADD AL,30H
XCHG AL,AH
MOV RES[SI],AH
INC SI
MOV AH,0
MOV CL,10
DIV CL
ADD AL,30H ;不用再除了,所以直接把AL放十位AH放个位
ADD AH,30H
MOV RES[SI],AL
INC SI
MOV RES[SI],AH
MOV AX,SEG res ;屏幕显示
MOV DS,AX
MOV DX, OFFSET res
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
2.运行截图
测试成功
3.修改数据再次测试
在数据段放入00256
测试成功
实验三:码制转换:将字数据转换为ASCII码表示的十六进制数,并显示输出。字数据的值域为0~65535,最多可转换为四位十六进制数。例如:字数据为0ffffh,则转换为:‘FFFF’
1.源代码
data segment
org 2000h
num dw 54A8h
org 2010h
res db 4 dup(?),'$'
data ends
CODES SEGMENT
ASSUME CS:CODES,DS:data
START:
MOV AX,data
MOV DS,AX
;此处输入代码段代码
MOV BX,[num] ;存储器移入寄存器
MOV CL,4 ;一次移动4位
MOV SI,0 ;偏移标志
MOV CH,4 ;共循环四次
AGAIN:
ROL BX,CL ;循环左移
MOV AL,BL ;转到累加器
AND AL,0FH ;截取低四位
ADD AL,30H ;转化为ASCII码
CMP AL,3AH ;判断是否大于9,如是的话要再加7变成字母对应的ASCII码
JL MOVING
ADD AL,7H
MOVING:
MOV RES[SI],AL ;偏移,存入存储器
INC SI
DEC CH
JNE AGAIN
LEA DX,res ;显示转换为十六进制后的数据
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
2.运行截图
测试成功
3.修改数据再次测试
在数据段放入5028H测试
测试成功