微机原理与接口技术汇编部分9道练习题(基础)

以下内容为个人微机课的作业练习题

A-1:在数组字变量ARRAY中有10个数,将数组中这10个数求和,放到RESULT存储区中。

程序代码:
DATA SEGMENT
ARRAY DW 1,2,-1,-3,5,3,4,10,20,35 ;待累加数据
RESULT DW 0 ;结果存储区
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA BX,ARRAY
MOV CX,10 ;计数器
POINT:MOV AX,[BX]
ADD RESULT,AX
ADD BX,2;地址移动步长为2
LOOP POINT
MOV AH,4CH ;4Cdos功能调用
INT 21H
CODE ENDS
END START
在这里插入图片描述
(10个测试数据相加:1+2+(-1)+(-3)+5+3+4+10+20+35=76=4CH,验证正确)

A-2:已知有多个元素(不少于10个)存放在以BUF为首址的字节存储区中,试找出其中第一个负数放到BUFF字节存储区。

程序代码:
DATA SEGMENT
BUF DB 1,2,-3,-1,-5,-3,-4,10,20,35 ;测试数据
LEN EQU $-BUF ;BUF长度
BUFF DB 0 ;第一个负数存储区
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA BX,BUF;取地址
MOV CX,LEN ;计数器
POINT:MOV AL,[BX];字节长度用AL不用AX
CMP AL,0
JL HAHA;如果小于0跳出循环
INC BX ;地址指针移动加一
LOOP POINT
HAHA:LEA BX,BUFF ;取地址
MOV [BX],AL ;将第一个负数移入BUFF
MOV AH,4CH ;4Cdos功能调用
INT 21H
CODE ENDS
END START

在这里插入图片描述

A-3:设有三个字节变量X、Y、Z,试找出X、Y有符号数中较大者送入Z中,编写程序。

程序代码:
DATA SEGMENT
X DB -2
Y DB 3
Z DB 0 ;存放x和y中最大值
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,X
;CMP BL,Y
CMP AL,Y
JL NEXT ;如果x比y小
MOV Z,AL ;否则x是最大值
JMP OVER;跳过下一步
NEXT:MOV AL,Y;y是最大值
MOV Z,AL
OVER:MOV AH,4CH ;4Cdos功能调用
INT 21H
CODE ENDS
END START
在这里插入图片描述

B-1:已知以BUF为首址的字存储区中存放着多个有符号的二进制数,试编写程序,将大于等于0的数送以BUF1为首址的字存储区中,将小于0的数送以BUF2为首址的字存储区中。

程序代码:
DATA SEGMENT
BUF DW -2,-1,0,4,5,-5,6,-6,7,-7 ;测试数据
LEN EQU ($-BUF)/2; BUF数据数量
BUF1 DW 10 DUP(0) ;零和正数存储区
BUF2 DW 10 DUP(0) ;负数存储区置
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA BX,BUF;取buf地址
MOV CX,LEN
LEA DI,BUF1
LEA SI,BUF2
LLL:MOV AX,[BX]
CMP AX,0
JGE BIG
MOV [SI],AX
ADD SI,2
JMP OVER;跳过下面两步
BIG:MOV [DI],AX;存储0和正数
ADD DI,2
OVER:ADD BX,2
LOOP LLL
MOV AH,4CH ;4Cdos功能调用
INT 21H
CODE ENDS
END START
在这里插入图片描述

B-2:设在变量单元A、B和C中存放有三个数,若三个数都不为0,则求出三个数之和存入D中;若有一个为0,则将其他两个单元也清零,编写程序。

程序代码:
DATA SEGMENT
A DB 5
B DB 0
C DB 8
D DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,A
OR AL,0
JZ NEXT1
MOV AL,B
OR AL,0
JZ NEXT1
MOV AL,C
OR AL,0
JZ NEXT1
JMP NEXT2
NEXT1:MOV AL,0
MOV A,AL
MOV B,AL
MOV C,AL
JMP OVER
NEXT2:MOV AL,A
ADD AL,B
ADD AL,C
MOV D,AL
OVER: MOV AH,4CH ;4Cdos功能调用
INT 21H
CODE ENDS
END START
在这里插入图片描述

B-3:在以BUF为首址的字节单元中存放了COUNT个无符号数,编写程序找出其中最大数送MAX单元。

DATA SEGMENT
BUF DB 1,5,2,8,3
COUNT EQU $-BUF
MAX DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV CX,COUNT
LEA BX,BUF
MOV AL,[BX]
MOV MAX,AL
POINT:INC BX
MOV AL,[BX]
CMP AL,MAX
JB NEXT
MOV MAX,AL
NEXT: LOOP POINT
OVER: MOV AH,4CH ;4Cdos功能调用
INT 21H
CODE ENDS
END START
在这里插入图片描述

C-1:已知在以BUF为首地址的字节存储区中,存放着一个以′$′作结束标志的字符串,试编写程序,在CRT上显示该字符串,并要求将小写字母以大写字母形式显示出来。

DATA SEGMENT
BUF DB “helloTeacherMeng$”
LEN EQU $-BUF-1
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA ;声明代码段,数据段
START:MOV AX,DATA
MOV DS,AX ;借助AX寄存器将DATA移到DS
LEA SI,BUF
MOV CX,LEN
L2: MOV AL,[SI]
CMP AL,61H ;a的asccii码
JB NEXT1
CMP AL,7AH ;z的asccii码
JA NEXT1
SUB AL,20H ;如果是小写字母则转化成大写字母
NEXT1: MOV [SI],AL
INC SI
LOOP L2
;INC SI
;MOV [SI],0AH
;INC SI
;MOV [SI],0DH
LEA DX,BUF ;字符串保存地址
MOV AH,09H ;9号dos功能调用
INT 21H
MOV AH,4CH ;4Cdos功能调用
INT 21H
CODE ENDS
END START
在这里插入图片描述

C-2:利用系统功能调用从键盘输入10个一位无符号数,求出其中最大和最小数,在显示器上输出显示。

DATA SEGMENT
BUF DB 20 ;buf空间长度
DB 0 ;实际输入数据的长度
DB 20 DUP(0) ;输入数据保存的空间
MAX DB 0;保存最大值
MIN DB 0FFH;
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA ;声明代码段,数据段
START:MOV AX,DATA
MOV DS,AX ;借助AX寄存器将DATA移到DS
LEA DX,BUF ;BUF为定义的数据缓冲区
MOV AH,0AH ;10号dos功能调用,输入10个数字
INT 21H
LEA SI,BUF[1]
MOV CL,[SI]
MOV CH,00H ;在BUF[1]读出数据长度放到CX
X2: INC SI
MOV AL,[SI]
SUB AL,‘0’ ;将字符转化成数字
CMP AL,MAX
JB X1 ;无符号数比较跳转
MOV MAX,AL
X1: CMP AL,MIN
JB X3;无符号数比较跳转
JMP X4; 跳过下一行
X3: MOV MIN,AL
X4: LOOP X2
ADD MAX,‘0’ ;将数字转化成字符
MOV DL,0DH ;回车
MOV AH,2H
INT 21H
MOV DL,0AH ;换行
MOV AH,2H
INT 21H
MOV DL,MAX
MOV AH,2H
INT 21H
MOV DL,0DH ;回车
MOV AH,2H
INT 21H
MOV DL,0AH ;换行
MOV AH,2H
INT 21H
ADD MIN,‘0’ ;将数字转化成字符
MOV DL,MIN
MOV AH,2H
INT 21H
MOV AH,4CH ;4Cdos功能调用
INT 21H
CODE ENDS
END START
在这里插入图片描述

C-3:编写程序,统计字符串STRING中某个单词的个数,字符串以’$'作为结束符,要统计的单词放在C_WORD中,统计结果存放在COUNT中。统计结果要求实现屏幕输出。例如:字符串为’adding that this is because of the large infrastructure investment, ’ 统计单词’because’的个数。

DATA SEGMENT
STRING DB “because that because is because of the large infrastructure investment$”
LEN1 DB $-STRING
COUNT DB 0
C_WORD DB “because”
LEN2 DB $-C_WORD-1 ;二重循环体对比部分为"ecause"
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA ;声明代码段,数据段
START:MOV AX,DATA
MOV DS,AX
LEA DI,STRING
MOV CL,LEN1 ;CX外层循环计数器
MOV CH,0
L1: MOV DL,0 ;DL记录临时匹配正确的个数
LEA SI,C_WORD ;每次外循环初始化SI
MOV AL,[DI]
INC DI ;外循环DI指针移动
CMP AL,[SI] ;如果第一个是’b’,进入内循环
JE L2
JMP LX ;如果不是’b’则continue外循环
L2: MOV BX,DI ;为了不影响外循环的DI
DEC BX ;L1内移动DI临时回退一步
L3: INC SI ;SI指针移动
INC BX ;BX指针移动
MOV AL,[BX]
CMP AL,[SI] ;比较下一个字母是否匹配
JNE LX ;不匹配则break,继续外循环
INC DL ;临时匹配正确的个数++
CMP DL,LEN2 ;当DL等于5时说明字符串有一个“because”
JNE L3 ;没到5则继续内层循环
INC COUNT ;到5则正确数count++
JMP LX ;继续外循环
LX: LOOP L1
MOV AL,COUNT
ADD AL,‘0’ ;数字转化成字符输出
MOV DL,AL
MOV AH,2H
INT 21H
MOV AH,4CH ;4Cdos功能调用
INT 21H
CODE ENDS
END START
在这里插入图片描述
(c-3题目的整体逻辑是c语言的两层循环遍历,然而时间复杂度是最差的O(n^2),
汇编代码太多行了ww,如果继续优化的则还需要很多很多的跳转判断指令和寄存器可能不够用,怕绕晕了,暂时先这样了_,ps:初学基础水平)

  • 11
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值