一、实验目的
????????1. 掌握分支结构程序的编程方法
????????2. 掌握汇编语言程序设计方法,自己编写程序,并调试运行验证结果。
二、实验内容
1.在键盘上输入一个字符,判断是否为小写字母,若不是,显示错误信息,若是,则将其转换为大写字母并显示。
? ? ? ? 代码及注释:
DATAS SEGMENT
message db 0AH,0DH,'Please enter a character:','$'
error_message db 0AH,0DH,'Error!','$'
output_message db 0AH,0DH,'Output letter: ','$'
output db 0
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
; 显示提示信息
mov ah, 09h
lea dx, message
int 21h
; 读取键盘输入
mov ah, 01h
int 21h
cmp al, 61h ; 检查是否小写字母
jge next1 ; 是小写字母则跳转next1
jmp next4 ; 不是小写,跳转到next4
next1:
cmp al, 7Ah ; 检查是否大写字母
jle next2 ; 如果小于等于7Ah,即是小写,跳转到next2
jmp next4 ; 不是小写,跳转到next4
next2:
sub al, 20h ; 转换为大写字母
mov output,al
; 显示输出提示信息
mov ah, 09h
lea dx, output_message
int 21h
next3:
mov ah, 02h
mov dl, output
int 21h
jmp next5 ; 跳转到next5,程序结束
next4:
;显示错误提示
lea dx, error_message
mov ah, 09h
int 21h
; 程序结束
next5:
MOV AH, 4CH
INT 21H
CODES ENDS
END START
????????运行结果及展示:?
????????①小写字母r成功转换为大写字母R:
? ? ? ? ②输入大写字母提示错误:
?
2.用分支结构设计程序实现符号函数,要求x和y存放在内存单元中,并将判断的结果在屏幕上显示输出。
? ? ? ? ? 代码及注释:
DATAS SEGMENT
x db -4 ; 变量x,赋值为-4
y db 2 ; 变量y,赋值为2
da db 'y=1','$' ; 定义字符串常量da,存储字符串"y=1"
den db 'y=0','$' ; 定义字符串常量den,存储字符串"y=0"
xiao db 'y=-1','$'; 定义字符串常量xiao,存储字符串"y=-1"
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES, DS:DATAS, SS:STACKS
START:
MOV AX, DATAS
MOV DS, AX
mov al, x ; 将x的值移到AL中
cmp al, 0 ; 比较AL中的值与0
JL next ; 如果小于0,跳转next
jg next1 ; 如果大于0,跳转next1
mov y, 0 ; 如果等于0,将0给到变量y
lea dx, den ; 将den的地址加载到DX中
mov ah, 09h ; 09输出字符串的功能号
int 21h ; 21h中断显示字符串
jmp next2 ; 无条件跳转到标签next2
next1:
mov y, 1 ; 将1移动到变量y中
lea dx, da ; 将da的地址加载到DX中
mov ah, 09h
int 21h
jmp next2 ; 跳转到next2
next:
mov y, -1 ; 将-1移动到y中
lea dx, xiao ; 将xiao的地址加载到DX中
mov ah, 09h
int 21h
next2:
MOV AH, 4CH ; 程序结束的功能号
INT 21H ; 21h中断终止程序
CODES ENDS
END START ; 程序结束
? ? ? ? 运行结果及展示:
3.求X的绝对值。提示:当X小于等于零时,求补码。当X大于零时,X与Y相加,相加之和放在AX中。?
? ? ? ? 代码及注释:
data segment
x db 3 ; 变量x,存储为有符号字节类型,并赋值为-1
y db 5 ; 变量y,赋值为5
abs_val db 0 ; 存储绝对值的变量
abs_msg db 0AH,0DH,"The absolute value of x is: $"
data ends
code segment
assume cs:code, ds:data
start:
mov ax, data ; 将数据段data的地址加载到AX寄存器中
mov ds, ax ; 将AX中的数据段地址移动到DS寄存器中
mov ah, 0 ; 将0移动到AH寄存器中
mov al, x ; 将变量x的值移动到AL寄存器中
cmp al, ah ; 比较AL寄存器中的值与AH寄存器中的值
jge lp1 ; 如果大于等于,跳转到lp1
neg al ; 将AL寄存器中的值取反
mov abs_val, al ; 将AL寄存器中的值移动到绝对值变量abs_val中
jmp lp2 ; 跳转到lp2
lp1:
add al, y ; 将变量y的值加到AL寄存器中
adc ah, 0 ; 将进位标志位加到AH寄存器中
mov abs_val, al ; 将AL寄存器中的值移动到绝对值变量abs_val中
lp2:
; 显示x的绝对值
mov ah,09h
lea dx,abs_msg
int 21h
mov ah, 02h
mov dl, abs_val
add dl, '0' ; 将绝对值转换为ASCII码
int 21h
; 结束程序
mov ah, 4Ch ; 设置程序终止的功能号为4Ch
mov al, 00h ; 设置返回代码为0
int 21h ; 调用21h中断终止程序
code ends
end start ; 程序结束
运行结果展示: