汇编程序——练习(二)

题目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

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值