【汇编】典例练习(一)

>_<

 
 

Q0 :先回忆基本结构,并熟悉本文的空行风格;你可以直接跳过!

要求:Hello World!

DATA SEGMENT
	BUF DB 'Hello World!', 0AH, 0DH, '$'
DATA ENDS

STACK SEGMENT STACK
	100 DB DUP(0)
STACK ENDS

CODE SEGMENT
	ASSUME CS:CODE, DS:DATA, SS:STACK
START:
		MOV AX, DATA
		MOV DS, AX
		MOV DX, OFFSET BUF
		MOV AH, 09H
		INT 21H
EXIT:
		MOV AH, 4CH
		INT 21H
CODE ENDS
END START

 
 
 
 

Q1 :内存单元NUM中存放一字节无符号数,编程将其拆分成两个一字节长的16进制数;

要求:HEX单元存放低位十六进制数,HEX+1存放高位十六进制数

DATA SEGMENT
	NUM DB 8AH
	HEX DB 0, 0
DATA ENDS

STACK SEGMENT STACK
	DB 100 DUP(0)
STACK ENDS

CODE SEGMENT
	ASSUME CS:CODE, DS:DATA, SS:STACK
START:
		MOV AX, DATA
		MOV DS, AX
		MOV AL, NUM
		MOV AH, AL	;保存副本到AH
		AND AL, 0FH	;屏蔽高四位
		MOV HEX, AL
		SHR AH, 4	;逻辑右移
		AND AL, 0FH	;屏蔽此时的高四位
		MOV HEX+1, AH
EXIT:				;返回操作系统
		MOV AH, 4CH
		INT 21H
CODE ENDS
END START

 
 

Q2 : 内存中有三个互不相等的有符号字数据,分别放在X,Y,Z字单元中,编程将最
    小值存入MIN单元

要求:注意审题:“有符号、字”

 DATA SEGMENT
 	X DW 1234H
 	Y DW 0BBBBH 
 	Z DW 4321H
 	MIN DW ? 
 DATA ENDS
 
 STACK SEGMENT STACK
 	DW 100 DUP(100)
 STACK ENDS
 
 CODE SEGMENT
 	ASSUME CS:CODE, DS:DATA, SS:STACK
 START:
 		MOV AX, DATA
 		MOV DS, AX
 		MOV AX, X
 		CMP AX, Y
 		JL L1		;注意是有符号数,使用JL; 若无符号则使用JB
 		MOV AX, Y
 L1:
 		CMP AX, Z	;这步之前的作用是保证AX存的是X,Y中的最小值
 		JL L2
 		MOV AX, Z
 L2:
 		MOV MIN, AX
 EXIT:
 		MOV AH, 4CH
 		INT 21H
CODE ENDS
END START

 

 

Q3 : 编程统计由NUM单元开始的数据块中能被3整除的数的个数(数据块中共有10个
    无符号数,数值自己拟定)

要求:结果存在COUNT单元中

DATA SEGMENT 
	NUM DB 41, 2,21,9,0FFH, 99, 23H, 21H, 8, 200
	COUNT DW 0
DATA ENDS

STACK SEGMENT STACK
	DB 100 DUP(0)
STACK ENDS

CODE SEGMENT 
	ASSUME CS:CODE, DS:DATA, SS:STACK
START:
		MOV AX, DATA
		MOV DS, AX
		LEA SI, NUM			;取偏移地址,置指针
		MOV CX, 10			;设置循环次数(每次LOOP (CX)自动减一)
		MOV DX, 0			;用于统计,先清零
		MOV BL, 3			;被除数(3)
LOP:
		MOV AL, [SI]		;取数到AL进行操作
		MOV AH, 0
		DIV BL				;对于字节,商存到AL,余数存到AH
		AND AH, AH			
		JNZ NEXT			;ZF = 0 则跳转
		INC DX
NEXT:
		INC SI		;地址+1,也就是指针移动
		LOOP LOP	;向上找到LOP,开始循环
		MOV COUNT, DX
EXIT:
		MOV AH, 4CH
		INT 21H
CODE ENDS
END START

 

 

Q4 : 编程统计DA1字单元中二进制数据中含1的个数,结果存于DA2单元中
    无符号数,数值自己拟定)

要求:设DA1字单元中的二进制数据为00110011

DATA SEGMENT
	DA1 DB 00110011B	;这里要注意加上B,否则伪指令默认数字为十进制
	DA2 DB 0
DATA ENDS

STACK SEGMENT STACK
	DB 100 DUP(0)
STACK ENDS

CODE SEGMENT
	ASSUME CS:CODE, DS:DATA, SS:STACK
START:
		MOV AX, DATA
		MOV DS, AX
		MOV AL, DA1		;送到AL操作
		MOV CX, 8		;循环8次
		XOR DL, DL		;相当于DL置零:MOV DL, 0
LOP:
		SHR AL, 1		;逻辑右移一位
		JNC NEXT		;CF保存的就是移出的数
		INC DL
NEXT:
		LOOP LOP
		MOV DA2, DL
EXIT:
		MOV AH, 4CH
		INT 21H
CODE ENDS
END START

 

 

Q5 : 内存中连续的16个单元中,存放着0~15的平方值(平方表);查表求平方值并
    将结果保存在RESULT中

要求:使用XLAT指令实现查表;(为了简化题目,数据段伪指令为:X DB 11,不需要再
    获得输入)

DATA SEGMENT 
	TABLE DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81
		  DB 100, 121, 144, 169, 196, 225
	X DB 11
	RESULT DB 0
DATA ENDS

STACK SEGMENT STACK
	DB 100 DUP(0)
STACK ENDS

CODE SEGMENT
	ASSUME CS:CODE, DS:DATA, SS:STACK
START:
		MOV AX, DATA
		MOV DS, AX
		LEA BX, TABLE		;设置表的基址给BX
		MOV AL, X			;待查数给AL
		XLAT				;查到的数返回到AL中
		MOV RESULT, AL
EXIT:
		MOV AH, 4CH
		INT 21H
CODE ENDS
END START

;这里需要注意,RESULT单元中存的是一个16进制的数字(ASCII),直接递送给DL的话打印的是ASCII对应的符号!

 
 
 

 
 
 
 
 

 

▲总结

① 一定要看代码中的注释思路关键代码的作用都在相应的注释里!

Q1Q2Q34分别是典型的顺序结构分支结构循环结构

③ Q5利用XLAT实现了一个典型的查表功能;

表是一段从已知地址开始的连续存储单元

  这个例子中表的内容实际上所存的ASCII码对应的字符

  表中也可以存的是偏移地址,通过查表找到对应的偏移量,便可以在数据段的另一段中找到相应的内容(可以是字符串)

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值