题目1:有两个32位数分别存在DAT1和DAT2开始的内存单元中,编一程序,求两数之和,结果放到SUN开始的单元。
DATA SEGMENT
DAT1 DW ....,....
DAT2 DW ....,....;存两个4位十六进制数
SUM DW 2 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
LEA SI, DAT1
LEA DI, DAT2
LEA DX, SUM;取有效地址
MOV AX, [SI]
ADD AX, [DI]
MOV [DX], AX;低字和传入SUM单元低字
ADD DX, 2;指向高字
MOV AX, [SI+2]
ADC AX, [DI+2];加上进位
MOV [DX], AX
E1: MOV AH, 4CH;结束程序
INT 21H
CODE ENDS
END START
题目2:有3个8位二进制数连续存放在DAT0开始的内存单元中,设它们之中至少有两个数是相同的。编写程序找出与另外两数不同的数,把该数所在的地址(段内偏移地址)送到DATE0单元,若三个数都相同则送0FFFFH到单元。
DATA SEGNEMTN
DAT0 DB ....,....,....;存放3个8位二进制数
DATE0 DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
LEA SI, DAT0
LEA DI, DATE0
MOV AL, [SI];第1个数
MOV AH, [SI+1];第2个数
MOV BL, [SI+2];第3个数
CMP AH, AL;1,2比较
JE A1;1,2相同则跳转
CMP BL, AH;1,2不同情况下进行2,3比较
JE A3;2,3相同,则不同的数为1
ADD SI, 1;2,3不同,则1,3相同
MOV [DI], SI
JMP E1
A1: CMP BL, AH;已知1,2情况下进行2,3比较
JE A2;三者相同则跳转
ADD SI, 2;不同的数为第3个
MOV [DI], SI
JMP E1
A2: MOV [DI], 0FFFFH;三者相同
JMP E1
A3:MOV [DI], SI;不同的数为第1个
E1: MOV AH, 4CH;结束程序
INT 21H
CODE ENDS
END START
题目13:找出一个数据块中的最大数。数据块从偏移地址1002H开始存放,数据块的长度以16位二进制形式存放在1000H、1001H单元,把找出的最大数放到2000H单元中。假设数据块中的数都是8位无符号数 。
DATA SEGNEMTN
ORG 1000H
LEN DW ?;数据块长度
ARRAY DB a1,a2,...,an
ORG 2000H
RESULT DB ?;用于存放结果
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
LEA SI, ARRAY
MOV CX, LEN
MOV AL, [SI]
DEC CX
LP: INC SI
CMP AL, [SI]
JA CON;AL>[SI]则跳转
MOV AL, [SI]
CON:LOOP LP
MOV [RESULT], AL;结果送入result
E1: MOV AH, 4CH;结束程序
INT 21H
CODE ENDS
END START
题目4:编写一程序,将键盘输入的大写字母转换为小写字母显示。
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AH, 01H
INT 21H;从键盘输入
CMP AL, 60H
JNC DIS;CF=0说明AL>60H
ADD AL, 20H;AL<60H,转小写
DIS:MOV DL, AL
MOV AH, 02H;输出字符
INT 21H
E1: MOV AH, 4CH;结束程序
INT 21H
CODE ENDS
END START
题目5:数据段buffer数组有100个字数据,统计该数组中所有为‘1’的位的个数,统计结果送入result单元。
DATA SEGMENT
BUFFER DW a1,a2,...,a100
COUNT EQU 100
RESULT DW ?
DATA ENDS
STACK SEGMENT
DB 64 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
LEA SI, BUFFER
MOV CX, COUNT
LP1:CALL COUNT1
INC SI
INC SI;移动指针
LOOP LP1
MOV AH, 4CH;程序结束
INT 21H
COUNT1 PROC
PUSH CX
MOV AX, [SI];取出当前的值
MOV CX, 0010H;移位16次
XOR BX, BX;清零,用于计数
LP2:SHR AX, 1
JNC CON;CF=0则跳转
INC BX;CF=1,记录
CON:LOOP LP2
ADD RESULT, BX
POP CX
RET
CODE ENDS
END START
===========================================================================
;第二种方法
START:
MOV AX, DATA
MOV DS, AX
LEA SI, BUFFER
MOV CH, COUNT
XOR BX, BX;计数器清零
LP1:MOV AX, [SI]
MOV CL, 16
LP2:SHR AX, 1
JNC NE
INC BX
NE: DEC CL;双层循环,故不使用LOOP指令
JNZ LP2
INC SI;字数据
INC SI
DEC CH;外层循环计数
JNZ LP1
MOV RESULT, BX
MOV AH, 4CH;程序结束
INT 21H
CODE ENDS
END START
题目6:统计数据段string字符串的字符个数,将统计值存入count单元中,字符串是由’$‘作为结束符的,统计时不计入该符号。
DATA SEGMENT
STRING DB 'How are you!','$'
COUNT DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
LEA SI, STRING
MOV AL, [SI]
XOR CX, CX
LP: CMP AL, '$'
JZ E1;若相等,则跳出
INC CX
INC SI
JMP LP
E1: MOV COUNT, CL
MOV AH, 4CH;程序结束
INT 21H
CODE ENDS
END START
题目7:已知某数组ARRAY中有50个8位带符号数,试用汇编语言编写一个完整的程序统计该数组中相邻两数之间符号变化(正数变负数或负数变正数)的次数,并将其存于NUM存储单元。
DATA SEGMENT
ARRAY DB ....,....,
NUM DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
LEA SI, ARRAY
MOV CX, 0031H;50个数比较49次
XOR BL, BL;计数器清零
LP: MOV AL, [SI];当前比较字符
MOV AH, [SI+1]
AND AL, 80H
AND AH, 80H;取符号位
CMP AH, AL
JE CON
INC BL
CON:INC SI
LOOP LP
MOV NUM, BL;将结果存入内存单元
MOV AH, 4CH
INT 21H
CODE ENDS
END START
题目8:比较从键盘输入的两个字符串长度,若相同显示'MATCH',否则显示’NOTMATCH‘
DATA SEGMENT
IP1 DB 'MATCH','$'
IP2 DB 'NOTMATCH','$'
STR1 DB 100 DUP(?);预留100个字节
DB ?
STR2 DB 100 DUP(?)
DB ?
DATA EDNS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
LEA DX, STR1
MOV AH, 0AH;字符串1输入
INT 21H
LEA DX, STR2
MOV AH, 0AH;字符串2输入
INT 21H
LEA SI, STR1;取有效地址
LEA DI, STR2
INC SI
INC DI
MOV AL, [SI]
CMP AL, [DI];比较长度
JZ E1;长度相等则跳转
LEA DX, IP2;长度不等
JMP E2
E1: LEA DX, IP1
E2: MOV AH, 09H
INT 21H;显示字符串
MOV AH, 4CH
INT 21H
CODE ENDS
END START
题目9:编程在内存中定义一组8位无符号二进制数。在屏幕上显示“Input a binary numbens:”,键入一个8位二进制数。在上述数组中搜索是否有此数据,有,则显示Found;否则,显示No Found。重复,直至键入回车符后程序退出。重复,直至按〈Enter〉键后结束程序。
STACK SEGMENT
DW 64 DUP(?)
STACK ENDS
DATA SEGMENT
ARRAY DB 34h, 0a1h, 3eh, 99h;定义数组
STR DB ‘Input A Binary Number:$’;定义输出字符串
F DB ‘FOUND$’
NF DB ‘NO FOUND$’
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
A0: MOV DL, 0AH;换行
INT 21H
MOV DL, 0DH;回车
INT 21H
LEA DX, STR1
INT AH, 09H
INT 21H;显示字符串
MOV CX, 0008H;8位二进制数
LEA SI, ARRAY;取数组的有效地址
MOV BL, 0
MOV BH, 04H
A1: MOV AH, 01H;从键盘键入一个字符
INT 21H
E0: CMP AL, 30H
JE CON
E1: CMP AL, 31H;输入的字符是否为0或1,若不是则结束程序
JNE D1
CON:DEC CX
SUB AL, 30H;ascii转数字
SAL AL, CL;左移cl位,作为高位
ADD BL, AL
INC CX
LOOP A1
A2: MOV DL, [SI]
CMP BL, DL
JNZ A3
LEA DX, F;显示找到了
MOV AH, 09H
INT 21H
JMP A0;继续开始
A3: INC SI
DEC BH
JNZ A2
LEA DX, NF;显示没有找到
MOV AH, 09H
INT 21H
JMP A0;继续开始
D1: MOV AH, 4CH
INT 21H
CODE ENDS
END START
题目10:用INT 10H,使显示器显示:A、B、C、D、…、X、Y、Z、1、2、3、…、8、9,并重复显示4次
STACK SEGMENT
DW 64 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, SS:STACK
START:
MOV CX, 0004H;循环显示4次
A1: CALL PRINT
LOOP A1
MOV AH, 4CH
INT 21H
PRINT:;子程序
PUSH CX
MOV AH, 0EH;显示字符功能号
MOV CX, 001AH;26个字母
MOV BL, 41H;A的ASCII值
A2: MOV AL, BL
INT 21H
INC BL
MOV DX, 0FFFFH;A3延时模块
A3: DEC DX
JNZ A3
LOOP A2
MOV CX, 0009H
MOV BL, 31H;1的ASCII值
A4: MOV AL, BL
INT 21H
INC BL
MOV DX, 0FFFFH
A5: DEC DX
JNZ A5
LOOP A4
POP CX
RET
CODE ENDS
END START