微机原理实验1

  • 格式:doc
  • 大小:808.00 KB
  • 文档页数:23

信息与通信工程学院 微机原理软件实验报告(二)

班 级: 姓 名: 学 号: 序 号: 日 期: 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码blbh作为每一行显示字符个数的界限;

Dos功能调用显示bl

结束Bl加1,bh减1Bh为0换行Cx减1Cx为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的个数存入数据块之后的第二个单元 mov [si],bh inc si ;将小于0的个数存入数据块之后的第三个单元 mov [si],dl mov si,offset buf ;指向数据块首地址 mov cx,count ;设置循环次数 done: mov al,[si] ;将数据段的内容赋值给al mov bh,al ;暂存数据 ;右移4位 shr al,1 shr al,1 shr al,1 shr al,1 call disp mov al,bh ;将暂存的数据送回al and al,0fh ;屏蔽掉高四位 call disp inc si loop done mov ah,4ch ;终止程序 int 21h disp proc cmp al,0ah ;与0ah比较,小于0ah,加30h js hyfive ;大于0ah,为十六进制数A~F,加37h add al,7 hyfive: add al,30h mov dl,al ;dos功能调用显示字符 mov ah,02 int 21h inc hy cmp hy,02 jz hyseven ret ;根据空格显示标志符hy的大小判断是否插入空格 hyseven: mov dl,20h ;插入空格 mov ah,2 int 21h inc dh mov hy,0 cmp dh,10h jz hysix ret hysix: mov dl,0dh ;回车换行 mov ah,02h int 21h mov dl,0ah mov ah,02h int 21h xor dh,dh ret disp endp code ends end start (2)程序流程图 开始初始化代码段,程序段,堆栈段基址设置存入数据循环次数cx和初始存入数据bl

Bl与0比较比零大,则存正数内存单元加1

为0,则存零内存单元加1

比零小,则存负数数内存单元加1

数据Bl加1内存单元地址加1Cx减1

Bl存入数据内存单元

Cx为0显示信息提示部分内存单元地址指向259个数据Cx置为259

显示数据高四位显示数据低四位

换行Cx减1内存地址si加1

一行数据为16个Cx减1内存地址si加1Cx为0结束>0<0=0是否是否

图2 3. 十六进制数转换成十进制数 (1) 源程序(附注释): name hexdec code segment assume cs:code ;提示信息 msg1 db 'erro number','$' msg2 db 'Hello! Please input the hexadecimal number:','$' msg3 db 'Hello! To exit this program,you only have six chances','$' msg4 db 'number overflow','$' hy db 0 count db 0 crlf macro ;定义宏指令,回车换行 mov dl,0dh mov ah,02h int 21h mov dl,0ah mov ah,2 int 21h endm start: mov ax,seg code mov ds,ax ;给数据段赋值,与代码段在同一个段