汇编程序——练习(一)

以下是我在复习时写的汇编程序练习,水平不高,如有错误请批评指正!

题目1:从ARRAY开始的单元中存有10个16位无符号数,试编一完整程序找出其中最小数并存入MIN单元。

DATA SEGMENT
	ARRAY DW, ..., ... ,;自己存入10个数
	MIN DW ?
DATA ENDS

CODE SEGMENT
	ASSUME CS:CODE, DS:DATA
START:
	MOV AX, DATA
	MOV DS, AX
	MOV CX, 9;比较九次
	LEA SI, ARRAY
	MOV AX, [SI];取第一个数
LP: INC SI
	INC SI
	CMP AX, [SI]
	JB CON
	MOV AX, [SI];AX中的数更大,更小数存入AX
CON:LOOP LP
E1: MOV MIN, AX
	MOV AH, 4CH
	INT 21H
CODE ENDS
	END START

题目2:从DAT开始的数据区中放有100个8位的无符号数,编程统计其中奇数的个数,将结果存入RESULT单元。

DATA SEGMENT
	DAT DB 100 DUP(?)
	RESULT DB ?
DATA EDNS

CODE SEGMENT
	ASSUME CS:CODE, DS:DATA
START:
	MOV AX, DATA
	MOV DS, AX
	LEA SI, DAT;取DAT有效地址
	MOV CX, 0064H;100个数
	XOR BL, BL;BL用于计数,应清零
LP:
	MOV AL, [SI]
	TEST AL, 01H
	JZ CON;是偶数
	INT BL;奇数统计
CON:INT SI
	LOOP LP
	MOV RESULT, BL
E1: MOV AH, 4CH
	INT 21H
CODE ENDS
	END START

题目3:利用DOS系统功能调用,将键盘输入的小写字母转换成大写字母输出显示,直到输入“$”字符时停止输出。

CODE SEGMENT
	ASSUME CS:CODE
START:
	MOV AX, DATA
	MOV DS, AX
	MOV BL, '$'
INPU:MOV AH, 01H
	INT 21H;读数据
	CMP AL, BL;判断是否为$字符
	JE EXT;若是则退出程序
	SUB AL, 20H;小写转大写,ASCII码
	MOV DL, AL
	MOV AH, 02H
	INT 21H;显示DL中的字符
EXT: MOV AH, 4CH
	INT 21H
CODE ENDS
	END START

题目4:建立两个过程:一个过程将16进制数变换成ASCII码,一个过程将ASCII码字符在屏幕上显示输出。

DATA SEGMENT
	HEXNUM DB ?;存1位16进制数
	ASC DB ?
DATA ENDS

CODE SEGMENT
	ASSUME CS:CODE, DS:DATA
START:
	MOV AX, DATA
	MOV DS, AX
	LEA SI, HEXNUM;取16进制数的有效地址
	LEA DI, ASC
	MOV AL, [SI]
	CMP AL, 09H
	JA A1
	ADD AL, 07H;为字母
A1: ADD AL, 30H
	MOV ASC, AL;存入数据单元
OP: MOV DL, ASC
	MOV AH, 02H;输出ASC
	INT 21H
EXT:MOV AH, 4CH
	INT 21H
CODE ENDS
	END START

题目5:已知从BUF单元开始存放着10个8位无符号数,要求编写汇编语言程序将这10个数去掉一个最大的,再去掉一个最小的,将其余的数的算术平均值计算出来并存于AVERG单字节单元。

DATA SEGMENT
	BUF DB ...,...;存10个8位无符号数
	AVERG DB ?
DATA ENDS
;找出最大数和最小数,累加10个数后减去最大数和最小数再除以8
CODE SEGMENT
	ASSUME CS:CODE, DS:DATA
START:
	MOV AX, DATA
	MOV DS, AX
	MOV CX, 09H
	LEA SI, BUF
	XOR AX, AX;清零
	MOV BL, [SI];存最小值
	MOV BH, [SI];存最大值
	MOV AL, [SI]
LP: INC SI
	CMP BH, [SI]
	JA CN1;BH>[SI],无需换
    MOV BH, [SI];[SI]更大,将最大值存入BH 
CN1:CMP BL, [SI]
	JB CN2
	MOV BL, [SI]
CN2:ADD AL, [SI]
	ADC AH, 0
	LOOP LP
	SUB AL, BL
	SBB AH, 0
	SUB AL, BH
	SBB AH, 0
	MOV DL, 08H;除数
	DIV DL
	MOV AVERG, AL
E1: MOV AH, 4CH
	INT 21H
CODE EDNS
	END START

题目6:要求编写程序比较两个最大长度为100个字符的字符串ALFA1和ALFA2是否相等,若
相等则输出显示“All Right!”,否则输出显示“Error!”。

DATA SEGMENT
	ALFA1 DB 100 DUP(?)
	ALFA2 DB 100 DUP(?)
	INFO1 DB 'All Right!'
	INFO2 DB 'Error!'
	LEN DB 100
DATA ENDS

CODE SEGMENT
	ASSUME CS:CODE, DS:DATA
START:
	MOV AX, DATA
	MOV DS, AX;数据段地址
	MOV ES, AX;附加段地址
	XOR CX, CX;清零
	CLD
	MOV CL, LEN
	REPNZ CMPSB
	JNZ NQ;不相等则跳转
	LEA DX, OFFSET INFO1;输出All Right
	JMP E1
NQ: LEA DX, OFFSET INFO2;输出Error
E1: MOV AH, 09H
	INT 21H
	MOV AH, 4CH
	INT 21H
CODE EDNS
	END START

题目7:有一个最大长度为80个字符的字符串STRING,试编写程序找出第一个空格的位置(用00H~4FH表示),并存入CL中。若该串无空格,则将0FFH存入CL中。

DATA SEGMENT
	STRING DB 80 DUP(?)
DATA ENDS

CODE SEGMENT
	ASSUME CS:CODE, DS:DATA
START:
	MOV AX, DATA
	MOV DS, AX;数据段
	MOV ES, AX;附加段
	MOV CX, 0050H;80个字符
	LEA DI, STRING
	MOV AL, ' ';待搜索的关键字
	CLD;方向标志,正向
	REPE SCASB;搜索关键字
	JNZ A1
	MOV AX, 0050H
	SUB AX, CX
	MOV CL, AL
	JMP E1
A1: MOV CL,0FFH
E1:	MOV AH, 4CH
	INT 21H
CODE EDNS
	END START	

题目8:编写求6!=6×5×4×3×2×1的程序,结果存入AL中。

CODE SEGMENT
	ASSUME CS:CODE
START:
	MOV CX, 0006H
	MOV AX, 0001H
LP: MUL CX
	LOOP LP
	MOV AH, 4CH
	INT 21H
CODE EDNS
	END START

题目9:从TABLE字节单元开始存有100个无符号数,试编程把数组中出现次数最多的数存入CH中,其出现次数存入CL中。

DATA SEGMNET
	TABLE DB ...,...
DATA ENDS
;从左到右,取数字去遍历其右边的数字,若该数字第一次出现,则其遍历后次数代表该数的最大出现次数
;若不是第一次出现,其左边虽然有数字出现未统计入,但其已经在第一次出现时就统计过该数字了
CODE SEGMENT
	ASSUME CS:CODE, DS:DATA
START:
	MOV AX, DATA
	MOV DS, AX
	MOV CX, 0063H;99
	LEA SI, TABLE;取有效地址
	XOR AX, AX;清零
	XOR DX, DX;先记录于DX,后转移到CX
LP1:PUSH SI
	PUSH CX;保护现场
	MOV AH, [SI];取当前字符去遍历
LP2:INC SI;
	CMP AH, [SI]
	JB NE1;AH!=[SI],转移
	INC AL
NE1:LOOP LP2
	POP CX;恢复数据
	POP SI
	INC SI
	CMP AL, DL
	JB NE2;AL<DL,本次计数的数字不是最多的
	MOV DL, AL;计数最多的数字次数
	MOV DH, AH;计数最多的数字字符
NE2:LOOP LP1;继续外层循环
	MOV CX, DX
	MOV AH, 4CH;结束程序
	INT 21H
CODE ENDS
	END START

题目10:从BUF字节单元开始存有按增序排好顺序的一个带符号数组,数组长度在LEN字节单元。在P0SI字节单元存有一个正数,要求将其按顺序插入到数组中,并修改数组长度。

DATA SEGMENT
	BUF DB ...,...;存LEN个递增带符号数
	LEN DB ?;数组长度
	POSI DB ?;待插入的数
DATA ENDS

CODE SEGMENT
	ASSUME CS:CODE, DS:DATA
START:
	MOV AX, DATA
	MOV DS, AX
	MOV CX, LEN;100个数
	MOV AL, POSI
	LEA SI, BUF;取有效地址
LP1: CMP AL, [SI]
	JL A1;若AL比[SI]小则转移 
	INC SI;指针往右指
	LOOP LP1
	MOV [SI], AL;AL比所有数都大,插在数组尾部
	JMP E1
A1: ADD SI, CX;指针指向队尾
LP2:MOV AH, [SI]
	MOV [SI+1], AH;中转
	DEC SI
	LOOP LP2
	MOV [SI], AL;插入新数据
A2: MOV AL, LEN;当前数组长度
	INC AL
	MOV LEN, AL;更新数组长度
E1:	MOV AH, 4CH;结束程序
	INT 21H
CODE ENDS
	END START

  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值