【微机原理与接口技术】实验1 汇编语言的了解

实验一

实验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

实验结果:
在这里插入图片描述

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值