以下是我在复习时写的汇编程序练习,水平不高,如有错误请批评指正!
题目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