微机原理实验1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息与通信工程学院微机原理软件实验报告(二)
班级:
姓名:
学号:
序号:
日期:2014年12月
一、实验目的
1)掌握MASM 的操作步骤,能够将源程序编译成可执行文件
2)掌握简单的DOS功能调用
3)掌握简单的汇编语言程序的设计
二、实验任务
1. 编一程序,在显示器上显示256个ASCII代码,要求显示格式为每行显示16个字符,
两个ASCII字符间空一格。
2. 试编一程序,把地址偏移量为100H 单元开始的256 个单元分别写入:00H,01 H,
02H,03H,…,FFH 数据。统计写入的数据块中0 元素、正元素、负元素的个数,并分别把统计结果送人上述数据块之后的三个单元中。用DOS功能调用显示上面两题中数据块各单元(包括统计结果)内容。为了显示清晰明了,要求每行显示16 个数据,两个数据之间用空格分开。(教材P185第1、2、3题合到一起编一完整的程序。)
3. 编一程序,把键入的十六进制数转换成十进制数并在屏幕上显示出来。键入的最大数为
FFFFH,若键人的不是十六进数字,则显示出错提示。(教材P188第21题。)
三、实验内容
1.显示256个ASCII码
(1)源程序(附注释):
data segment ;定义数据段
buf db 256 dup (?)
count equ $-buf ;将buf定义的字节长度赋值给count data ends
code segment ;定义代码段
assume ds:data,cs:code
start: mov ax,data
mov ds,ax
mov si,offset buf ;设置数据块首地址
mov cx,count ;设定循环次数
cld ;地址修改为增量
xor ax,ax
xor dx,dx
xor bx,bx
hyone: mov [si],al ;将数据存入数据段
inc si
inc al
loop hyone
mov si,offset buf ;指向数据块首地址
mov cx,count-1
hytwo: mov dl,[si] ;显示数据段的内容
mov ah,2
int 21h
mov dl,20h ;插入空格
mov ah,2
int 21h
inc si
inc bl ;设定为换行指示标志
cmp bl,10h ;当显示了16个字符之后就换行
jz hythree
loop hytwo
;回车换行
hythree: mov dl,0dh
mov ah,02h
int 21h
mov dl,0ah
mov ah,02h
int 21h
xor bl,bl ;将换行指示标志重新置为0
cmp cx,0 ;判断是否显示完
jnz hytwo ;没有显示完的话继续显示
jz hyfour ;显示完结束程序
hyfour:
mov ah,4ch ;终止程序
int 21h code ends
end start
(2)程序流程图: 开始
初始化代码段,程序段基址
设置存入数据循环次数cx 和初始ASCII 码bl
bh 作为每一行显示字符个数的界限;
Dos 功能调用显示bl
结束
Bl 加1,bh 减1
Bh 为0
换行
Cx 减1
Cx 为0
是否
是
否
图1
2. 写入数据,统计各类元素个数
(1)源程序(附注释):
data segment ;定义数据段
org 100h ;设定初始偏移量为100h
buf db 259 dup(?) ;定义259个数据存放地址
count equ $-buf ;将buf定义的字节长度赋值给count hy db 0 ;定义变量hy作为空格显示控制标志data ends
code segment ;定义代码段
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov si,offset buf ;设置数据块首地址
mov cx,count-3 ;将循环次数存入cx中
cld ;地址修改为增量
xor bx,bx
xor ax,ax
xor dx,dx
hyone: mov[si],al ;将数据存入数据段
inc si
inc al
loop hyone
mov si,offset buf ;指向数据块首地址
mov cx,count-3 ;将循环次数存入cx中
lodsb ;把si指向的存储单元读入累加器hytwo: mov al,[si]
and al,al
jz zero ;如果为0的话则跳转到zero
jns positive ;如果大于0的话则跳转到positive
js negtive ;如果小于0的话则跳转到negtive zero: inc bl ;统计为0的个数,用bl计数
jmp hythree
positive: inc bh ;统计大于0的个数,用bh计数
jmp hythree
negtive: inc dl ;统计小于0的个数,用dl计数
jmp hythree
hythree: inc si ;si加一
loop hytwo ;继续判断下一个数
hyfour: dec si ;先执行后判断所以si要减1
;将0的个数存入数据块之后的第一个单元
mov [si],bl
inc si
;将大于0的个数存入数据块之后的第二个单元