实验一
实验1-1
在以BUF为首地址的字节存储区存放有若干个无符号数,求该序列中的最大值,并在屏幕上输出该最大值。输入如下源程序并运行,查看运行结果。要求:了解汇编指令,学会单步调试:
汇编语言如下:
stack segment stack
db 200 DUP(?)
stack ends
data segment
buf db 12h,22h,4h,15h,9h,63h,1h,60h,62h
N equ $-BUF
max db ?
min db ?
data ends
code segment
assume cs:code,ds:data,ss:stack
start:
mov ax,data
mov ds,ax
mov si,offset buf ;取得buf数据存储区的首地址
mov cx,N ;数据个数
call maxmin
mov cl,bh ;bh为最大值
mov ah,02h ;2号功能调用
mov dl,cl
int 21h
mov ax,4c00h ;返回DOS
int 21h
maxmin proc
push ax
mov bh,[si] ; 取得buf数据存储区中的数据
mov bl,bh
dec cx
A1:
inc si
mov al,[si]
cmp al,bh
jle a3
A2:
mov bh,al
A3: loop A1
pop ax
ret
maxmin endp
code ends
end start
实验2-2
在上面程序的基础上,添加修改代码补充程序,要求能同时求出最大值和最小值,在主程序段输出显示得到的最大值和最小值。
data segment
buf db 12h,22h,4h,15h,9h,63h,1h,60h,62h ;存储的是数据,ASCII码的值
N equ $-BUF
max db ?
min db ?
data ends
code segment
assume cs:code,ds:data,ss:stack
start:
mov ax,data
mov ds,ax
mov si,offset buf ;取得buf数据存储区的首地址
mov cx,N ;数据个数
call maxmin
mov max,bh ;bh为最大值
mov min,bl ;bl为最小值
mov ah,02h
mov dl,max ;2号功能调用,输出最大值
int 21h
mov ah,02h
mov dl,min ;2号功能调用,输出最小值
int 21h
mov ax,4c00h ;返回DOS
int 21h
maxmin proc
push ax
mov bh,[si] ;取得buf数据存储区中的数据
mov bl,bh
dec cx
A1:
inc si ;目标操作数加1
mov al,[si]
cmp al,bh ;比较指令,两个操作数相减
jbe a2 ;跳转指令,小于等于
mov bh,al
jle a3 ;跳转指令,小于、等于或者不大于
A2:
cmp al,bl
jae a3 ;跳转指令,大于等于
mov bl,al
A3: loop A1 ;循环指令
pop ax
ret
maxmin endp
code ends
end start
实验结果:
实验二
实验2-1
从键盘上输入一个字符,如果输入的事大写字母,则在屏幕上输出其对应的小写字母,如果输入了除大写字母外的其他字符,显示提示信息“PLEASE INPUT AN ENGLISH LETTER!”。源程序如下所示:
汇编语言:
stack segment stack
db 200 dup(0)
stack ends
data segment
string db ' PLEASE INPUT AN ENGLISH LETTER!', 0ah,0dh, '$'
data ends
code segment
assume cs:code, ds:data, ss:stack
start:
mov ax,data
mov ds,ax
mov ah,01h
int 21h
cmp al,'A'
jl exit
L1:
cmp al,'Z'
jg exit
add al,32
mov cl,al
exit1:
mov dl,cl
mov ah,02h
int 21h
mov ax,4c00h
int 21h
exit:
mov dl,0ah
mov ah,02h
int 21h
mov ax,data
mov ds,ax
mov dx,offset string
mov ah,09h
int 21h
mov ax,4c00h
int 21h
code ends
end start
实验2-2
在上面程序的基础上,添加修改代码补充程序,要求:判断输入的字符,如果是大写字母则输出其小写字母,如果输入的字符是小写字母则输出其对应的大写字母,输入其他字符则显示提示信息“PLEASE INPUT AN ENGLISH LETTER!”。
stack segment stack
db 200 dup(0)
stack ends
data segment
string db ' PLEASE INPUT AN ENGLISH LETTER!', 0ah,0dh, '$'
data ends
code segment
assume cs:code, ds:data, ss:stack
start:
mov ax,data
mov ds,ax
mov ah,01h
int 21h ;调用2号指令
cmp al,'A' ;与ASCII码A进行比较
jl exit ;有符号数的条件转移指令,小于、不大于jump less,即如果小于A就跳转到exit
L1:
cmp al,'Z' ;与ASCII码Z进行比较
jg L2 ;大于转移指令,即如果大于Z就跳转到L2
add al,32 ;将al的值加32,进行大小写的转换
mov cl,al
exit1:
mov dl,cl
mov ah,02h
int 21h ;调用2号指令
mov ax,4c00h
int 21h ;调用2号指令
L2:
cmp al,'a' ;比较指令,与a进行比较
jl exit ;如果小于,则跳转到exit
cmp al,'z' ;比较指令,与z进行比较
jg exit ;如果大于,则跳转到exit
sub al,32 ;将al的值减去32,进行大小写字母转换
mov cl,al
exit2:
mov dl,cl
mov ah,02h
int 21h
mov ax,4c00h
int 21h
exit:
mov dl,0ah
mov ah,02h
int 21h
mov ax,data
mov ds,ax
mov dx,offset string ;如果想输出话语,则可以改变string的内容
mov ah,09h
int 21h
mov ax,4c00h
int 21h
code ends
end start
实验结果: