目录
1.求内存变量 NUM 中 10 个有符号数的最大值并放入 MAX 中。
2.将 0 至 100 中的奇数求和,结果送 SUM 字单元。
3.编程统计 NUM 字节单元中奇数的个数,将个数存入 RESULT 单元。
4.编程统计 BUF 内存区若干个有符号数中正数、负数、零的个数并保存到相对应的结果单元。
5.把内存 2000H 单元中 10 个有符号字节数分成正数和负数,分别存入 P 和 N 单元,并分别统计正数和负数的个数放入 DL 和 DH 寄存器中,请编程实现。
6.在数据段中 TABLE 开始的存储区为某班级的某门课程的成绩单,共有 20 个 成绩。编程统计其中大于等于 90 分的人数存储到 TOTAL 单元中。
7.在 1000H 为首地址的连续 20 个字节单元中存放了 20 个有符号数据,找出最大的数并存入 2000H 单元。
8.编写程序段,将 AX 寄存器中的内容以相反的顺序传送到 DX 寄存器中,并要 求 AX 中的内容不被破坏,然后统计 DX 寄存器中“1”的个数并存入 BL 中。
9.将内存中以 BUF 为首地址的 100 个字节单元中为原码表示的有符号数,依次 变成用补码表示的有符号数,仍然依次放在原 100 个字节单元中,请编写完整程 序。
2.键盘接收 10 个字母(不区分大小写,不回显),显示器输出 10 个小写字母。
3.请编写完整的程序,完成用单个字符输入的 1 号功能调用,从键盘输入 10 个 字符,然后用 2 号功能以相反的顺序显示输出这 10 个字符。
5.编写完整程序,将键盘输入的小写字母转换成大写字母并输出显示,直到输入 字符‘$’结束。如果输入的不是小写字母时要显示错误提示‘PLEASE INPUT AGAIN!’
6.将 BX 寄存器的 16 进制内容输出到屏幕上,假设 BX=1A2BH。
1.已知 AX 中存放的是有符号数-5,实现((AX)×5+14)/2,结果存入 mem 子单 元。不能使用乘除法指令,编写源程序。
2.实现多字节加法,将 A(A776139FH)+B(C0159471H)求和,结果存入 C 连续 的单元中。
3.设在 A、B 和 C 单元中分别存放着三个数。若三个数都不是 0,则求出三数之和存放在 D 单元中;若其中一个数为 0,则把其它两单元也请 0。请编写源程序。
1.设变量 x 字单元的值为带符号数,x 和 y 为字单元的变量,编写程序,按以下要求给 y 赋值。
2.首地址为 DAT 的数据区中有 3 个互不相等的 8 位无符号整数,请编写完整程序,将这 3 个数的最大值存放到 MAX 单元。
第一类、循环结构
1.求内存变量 NUM 中 10 个有符号数的最大值并放入 MAX 中。
DATA SEGMENT
NUM DB 1,-2,3,-4,5,-6,7,-8,9,-10
MAX DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AL,NUM
MOV BX,OFFSET NUM
MOV CX,9
AGAIN:INC BX
CMP AL,[BX]
JGE NEXT
MOV AL,[BX]
NEXT: LOOP AGAIN
MOV MAX,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
2.将 0 至 100 中的奇数求和,结果送 SUM 字单元。
DATA SEGMENT
SUM DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AX,0
MOV DX,1
MOV CX,50
AGAIN:ADD AX,DX
INC DX
INC DX
LOOP AGAIN
MOV SUM,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
3.编程统计 NUM 字节单元中奇数的个数,将个数存入 RESULT 单元。
DATA SEGMENT
NUM DB 1,2,3,4,5,6,7,8,9,10
RESULT DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV DL,0
MOV BX,OFFSET NUM
MOV CX,10
AGAIN:MOV AL,[BX]
TEST AL,01H
JZ NEXT
INC DL
NEXT: INC BX
LOOP AGAIN
MOV RESULT,DL
MOV AH,4CH
INT 21H
CODE ENDS
END START
4.编程统计 BUF 内存区若干个有符号数中正数、负数、零的个数并保存到相对应的结果单元。
DATA SEGMENT
BUF DB 10,20,0,0,0,-10,-20,-30,-40,-50
COUNT EQU $-BUF
ZS_COUNT DB 0
FS_COUNT DB 0
LS_COUNT DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET BUF
MOV CX,COUNT
XOR DL,DL;初始化正数个数
XOR DH,DH;初始化负数个数
XOR AH,AH;初始化零的个数
AGAIN:MOV AL,[BX]
CMP AL,0
JG ZS;如果是正数,则跳转
JL FS;如果是负数,则跳转
INC AH
JMP NEXT
ZS:INC DL
JMP NEXT
FS:INC DH
NEXT:INC BX
LOOP AGAIN
MOV ZS_COUNT,DL;保存正数结果
MOV FS_COUNT,DH;保存负数结果
MOV LS_COUNT,AH;保存零的结果
MOV AH,4CH
INT 21H
CODE ENDS
END START
5.把内存 2000H 单元中 10 个有符号字节数分成正数和负数,分别存入 P 和 N 单元,并分别统计正数和负数的个数放入 DL 和 DH 寄存器中,请编程实现。
ATA SEGMENT
ORG 2000H
BUF DB 2,5,-6,7,-8,9,12,22,-17,19
P DB 10 DUP(?) ;存正数
N DB 10 DUP(?) ;存负数
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA BX,BUF
LEA SI,P
LEA DI,N
MOV DL,0 ;统计正数
MOV DH,0 ;统计负数
MOV CX,10
AGAIN:MOV AL,[BX]
CMP AL,0
JGE P1
MOV [DI],AL ;负数时存入 N 单元
INC DH ;负数时统计存入 DH
INC DI
JMP NEXT
P1:MOV [SI],AL ;正数时存入 P 单元
INC DL ;正数时统计存入 DL
INC SI
NEXT:INC BX
LOOP AGAIN
MOV AH,4CH
INT 21H
CODE ENDS
END START
6.在数据段中 TABLE 开始的存储区为某班级的某门课程的成绩单,共有 20 个 成绩。编程统计其中大于等于 90 分的人数存储到 TOTAL 单元中。
DATA SEGMENT
TABLE DB 77,88,87,90,91,92,76,86,65,93,77,88,87,90,91,92,76,86,65,93
TOTAL DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET TABLE
MOV CX,20
MOV BL,0
AGAIN:MOV AL,[SI]
CMP AL,90
JB NEXT
INC BL
NEXT:INC SI
LOOP AGAIN
MOV TOTAL,BL
MOV AH,4CH
INT 21H
CODE ENDS
END START
7.在 1000H 为首地址的连续 20 个字节单元中存放了 20 个有符号数据,找出最大的数并存入 2000H 单元。
DATA SEGMENT
ORG 1000H
TABLE DB 77,88,87,90,91,92,76,86,65,93,77,88,100,90,91,92,76,-86,-65,93
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET TABLE
MOV AL,[BX]
MOV CX,19
AGAIN:INC BX
CMP AL,[BX]
JGE NEXT
MOV AL,[BX]
NEXT:LOOP AGAIN
MOV BX,2000H
MOV BYTE PTR [BX],AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
8.编写程序段,将 AX 寄存器中的内容以相反的顺序传送到 DX 寄存器中,并要 求 AX 中的内容不被破坏,然后统计 DX 寄存器中“1”的个数并存入 BL 中。
CODE SEGMENT
ASSUME CS:CODE
START:PUSH AX
MOV BL,0
MOV DX,0
MOV CX,16
AGAIN:SHL AX,1
JNC NEXT
INC BL
NEXT:RCR DX,1
LOOP AGAIN
POP AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
9.将内存中以 BUF 为首地址的 100 个字节单元中为原码表示的有符号数,依次 变成用补码表示的有符号数,仍然依次放在原 100 个字节单元中,请编写完整程 序。
DATA SEGMENT
BUF DB 100 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA BX,BUF
MOV CX,100
NEXT:TEST BYTE PTR [BX],80H ;测试最高位,来判断正负
JZ ZS ;如果是正数,则保持不变
AND BYTE PTR [BX],7FH ;如果是负数,最高位置零
NEG BYTE PTR [BX] ;如果是负数,然后在取补
ZS:INC BX
LOOP NEXT
MOV AH,4CH
INT 21H
CODE ENDS
END START
第二类、输入输出
1.键盘接收一个小写字母,显示器输出一个大写字母。
CODE SEGMENT
ASSUME CS:CODE
START:MOV AH,1 ;调用 1 号功能输入
INT 21H
SUB AL,20H ;小写变大写
MOV DL,AL
MOV AH,2 ;调用 2 号功能输出
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
2.键盘接收 10 个字母(不区分大小写,不回显),显示器输出 10 个小写字母。
CODE SEGMENT
ASSUME CS:CODE
START:MOV CX,10
AGAIN:MOV AH,1 ;调用 1 号功能输入
INT 21H
CMP AL,61H ;如果码值>='a',直接输出
JAE DISP
ADD AL,20H ;大写变小写
DISP:MOV DL,AL
MOV AH,2 ;调用 2 号功能输出
INT 21H
LOOP AGAIN
MOV AH,4CH
INT 21H
CODE ENDS
END START
3.请编写完整的程序,完成用单个字符输入的 1 号功能调用,从键盘输入 10 个 字符,然后用 2 号功能以相反的顺序显示输出这 10 个字符。
CODE SEGMENT
ASSUME CS:CODE
START:MOV AX,0
MOV CX,10
LP1:MOV AH,1
INT 21H
PUSH AX
LOOP LP1
MOV CX,10
LP2:POP DX
MOV AH,2
INT 21H
LOOP LP2
MOV AH,4CH
INT 21H
CODE ENDS
END START
4.一个采用查询方式输入数据的 I/O 接口中,8 位数据端口地址为 2000H,1 位 状态端口地址为 2002H,外设状态位用 D7 传送,高电平表示数据准备好。设 1000 个字节数据存在内存 BUFFER 为首地址的缓冲区中,写出查询方式输入 1000 个 字节数据的程序段
LEA SI,BUFFER
MOV CX,1000
P: MOV DX,2002H
L: IN AL,DX
TEST AL,80H
JZ L
MOV DX,2000H
IN AL,DX
MOV [SI],AL
INC SI
LOOP P
HLT
5.编写完整程序,将键盘输入的小写字母转换成大写字母并输出显示,直到输入 字符‘$’结束。如果输入的不是小写字母时要显示错误提示‘PLEASE INPUT AGAIN!’
DATA SEGMENT
ERRMSG DB 'PLEASE INPUT AGAIN!',0DH,0AH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
AGAIN:MOV AH,1
INT 21H
CMP AL,'$'
JE EXIT
CMP AL,'a'
JB ERROR
CMP AL,'z'
JA ERROR
SUB AL,20H
MOV DL,AL
MOV AH,2
INT 21H
JMP AGAIN
ERROR:LEA DX,ERRMSG
MOV AH,9
INT 21H
JMP AGAIN
EXIT:MOV AH,4CH
INT 21H
CODE ENDS
END START
6.将 BX 寄存器的 16 进制内容输出到屏幕上,假设 BX=1A2BH。
CODE SEGMENT
ASSUME CS:CODE
START:MOV BX,1A2BH
MOV CH,4
NEXT:MOV CL,4
ROL BX,CL
MOV DL,BL
AND DL,0FH
CMP DL,10
JB JB10
ADD DL,7
JB10:ADD DL,30H
MOV AH,2
INT 21H
DEC CH
JNZ NEXT
MOV AH,4CH
INT 21H
CODE ENDS
END START
第三类、数值计算
1.已知 AX 中存放的是有符号数-5,实现((AX)×5+14)/2,结果存入 mem 子单 元。不能使用乘除法指令,编写源程序。
DATA SEGMENT
mem DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AX,-5
MOV BX,AX
MOV CL,2
SAL AX,CL
ADD AX,BX
ADD AX,14
SAR AX,1
MOV mem,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
2.实现多字节加法,将 A(A776139FH)+B(C0159471H)求和,结果存入 C 连续 的单元中。
DATA SEGMENT
A DB 0A7H,76H,13H,9FH
B DB 0C0H,15H,94H,71H
C DB 5 DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA DI,A+3 ;获取 A 内存单元末地址
LEA SI,B+3 ;获取 B 内存单元末地址
LEA BX,C+4 ;获取 C 内存单元末地址
AND AX,AX
MOV CX,4
AGAIN:MOV AL,[DI]
ADC AL,[SI]
MOV [BX],AL
DEC DI
DEC SI
DEC BX
LOOP AGAIN
MOV AL,0 ;看结果是否有进位
RCL AL,1
MOV [BX],AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
3.设在 A、B 和 C 单元中分别存放着三个数。若三个数都不是 0,则求出三数之和存放在 D 单元中;若其中一个数为 0,则把其它两单元也请 0。请编写源程序。
DATA SEGMENT
A DW 2
B DW 5
C DW 6
D DW 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
CMP A,0
JE NEXT
CMP B,0
JE NEXT
CMP C,0
JE NEXT
MOV AX,A
ADD AX,B
ADD AX,C
MOV D,AX
JMP EXIT
NEXT:MOV A,0
MOV B,0
MOV C,0
EXIT:MOV AH,4CH
INT 21H
CODE ENDS
END START
第四类、分支结构
1.设变量 x 字单元的值为带符号数,x 和 y 为字单元的变量,编写程序,按以下要求给 y 赋值。
DATA SEGMENT
x DW 5
y DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AX,x
CMP AX,30
JG MAX
CMP AX,1
JL MIN
MOV y,0
JMP EXIT
MAX:MOV y,2
JMP EXIT
MIN:MOV y,-2
EXIT:MOV AH,4CH
INT 21H
CODE ENDS
END START
2.首地址为 DAT 的数据区中有 3 个互不相等的 8 位无符号整数,请编写完整程序,将这 3 个数的最大值存放到 MAX 单元。
DATA SEGMENT
DAT DB 6,7,8
MAX DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AL,DAT+0 ;AL←06H
MOV BL,DAT+1 ;BL←07H
MOV CL,DAT+2 ;CL←08
L1:CMP AL,BL
JA L2 ;AL 中的数据高于 BL 中的数据则跳转
XCHG AL,BL
L2:CMP AL,CL ;AL 中的数据高于 CL 中的数据则跳转
JA L3
XCHG AL,CL ;AL 中的数据为最大值
L3:MOV MAX,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
第五类、编码转换
1.把 2 位压缩的 BCD 码变成十进制数。
DATA SEGMENT
X DB 32H
Y DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV CL,4
MOV AL,X
SHR AL,CL
MOV BL,10
MUL BL
MOV BH,X
AND BH,0FH
ADD AL,BH
MOV Y,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START