当前位置:首页 > 汇编语言程序设计实验指导
汇编语言程序设计 140
实验四 完整段定义程序实现
实验目的
1、掌握完整段格式定义的程序设计方法;
2、掌握伪指令:SEGMENT、ENDS、ASSUME、END、OFFSET、DUP; 3、掌握汇编语言程序中指名程序入口的方法; 4、了解用INT 21H 的4C号功能调用返回系统的方法; 5、掌握用MASM、LINK工具进行汇编和链接的过程。
实验内容
要求程序中实现对键盘输入的字符作如下处理:
? 如果输入的是小写字母则转换成对应的大写字母并显示在屏幕上; ? 如果输入的是大写字母则转换成对应的小写字母并显示在屏幕上; ? 如果输入的是键盘上的Esc键则退出程序执行; ? 按其它任意可显示键,则不作处理,直接显示输出。
实验步骤
1、编辑下列程序:
DATA SEGMENT ;数据段定义
MESSAGE DB 'Please input your key!',0DH,0AH,'$'
DATA ENDS
STACK SEGMENT PARA STACK 'STACK' ;堆栈段定义
DB 50 DUP(?)
STACK ENDS
CODE SEGMENT ;代码段
ASSUME CS:CODE,DS:DATA,SS:STACK ;分配段寄存器
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MESSAGE MOV AH,9
INT 21H ;显示提示信息
AGAIN: MOV AH,1
INT 21H ;读入一个键盘按键
CMP AL,1BH ;按的是ESC键(ASCII码为1BH)则退出程序 JE EXIT CMP AL,61H JB NEXT
汇编语言程序设计实验指导 141
CMP AL,7AH JA NEXT
SUB AL,20H ;ASCII码在61H和7AH之间(小写字母)则转换为大写字母 JMP DISP
NEXT: CMP AL,41H
JB DISP CMP AL,5AH JA DISP
ADD AL,20H ;ASCII码在41H和5AH之间(大写字母)则转换为小写字母
DISP: MOV DL,AL
MOV AH,2
INT 21H ;显示当前字符 JMP AGAIN ;循环
EXIT: MOV AH,4CH ;结束程序
INT 21H
CODE ENDS
END START ;指定START标号为程序入口地址
2、把上述程序保存为ASM源文件,利用MASM根据对源文件进行汇编,产生.OBJ文件,若汇编时提示有错,编辑工具修改源程序后重新汇编,直至通过。
3、用LINK将.OBJ文件连接成可执行的.EXE文件。
4、在DOS状态下运行LINK产生的.EXE文件,按过键盘之后在屏幕上显示实验要求的字符,按ESC键可返回DOS。
注:汇编过程中若出现错误,可参阅本章最后的实验附录。 5.把上述程序改为简化段定义格式,再汇编,查看执行结果。
汇编语言程序设计 142
实验五 分支结构程序设计
实验目的
1、掌握利用无条件转移指令JMP和有条件转移指令实现多分支程序的设计方法。 2、掌握用DOS的中断调用,实现再程序执行过程中从键盘动态输入字符串的方法。 3、掌握程序中标号的定义和使用。
实验内容
实现从键盘输入一个月份数值(1-12),根据输入的月份数值显示相应的月份英文单词缩写,如输入5则显示May。
实验步骤
1、编辑下列程序:
.model small .stack .data
mon db 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec' msg1 db 'Please input a month(1-12) :',13,10,'$' msg2 db 'Input error! Now try again...',13,10,'$' buffer label byte ;定义输入月份的输入缓冲区 maxlen db 3 ;最多2个数字,包括一个回车 actlen db ? ;保存实际输入的字符个数
string db 3 dup(?) ;保存输入的月份数字内容(ASCII码) .code .startup
shuru: ;开始输入月份编号 lea dx,msg1 mov ah,09h
int 21h ;显示提示信息 lea dx,buffer mov ah,0ah
int 21h ;输入月份数值
cmp actlen,0 ;若没有输入月份则转出错处理 je shuruerr
;以下判断输入月份是否合法
lea di,string cmp actlen,2
je da10 ;若输入的是2位数月份值则转到da10标号处执行 mov al,string ;若只输入1位数字月份值,则读出该值 and al,0fh ;把ASCII码转换为对应数字
汇编语言程序设计实验指导 143
jmp jisuan da10:
mov al,string and al,0fh ;把月份数值十位的ASCII码转换为对应数字(如12月的1字) mov bl,10 mul bl
and string[1],0fh ;把月份数值个位的ASCII码转换为对应数字 add al,string[1] ;十位加上个位 (如12月) jisuan: ;以下计算偏移地址 cmp al,1 ;比1小是非法月份
jb shuruerr ;若月份值小于1则转出错处理 cmp al,12
ja shuruerr ;比12大也是非法月份 sub al,1 ;月份值减1 shl al,1
shl al,1 ;月份再乘4对应了MON字符串中从首地址开始的字符相对位置 xor ah,ah ;1月份从0位置开始即JAN,...5月份从位置16开始即MAY lea si,mon ;找到被显示月份字符的位置 add si,ax mov cx,3
output: mov dl,[si] ;输出对应月份英文缩写 mov ah,2 int 21h inc si
loop output .exit 0
shuruerr: lea dx,msg2 ;输入出错时提示出错,并转到程序起始处重新执行 mov ah,09h int 21h jmp shuru end
2、程序汇编通过后,运行程序察看输出结果。
3、程序运行中不输入月份值(直接回车),或输入非法月份值,观察程序执行的情况。
共分享92篇相关文档