汇编程序设计习题(2)

[!FAQ] 3.7 试编程序将 MOLT 中的一个8位二进制数乘以20,乘积放在 ANS 单元及其下一个单元中(用3种方法来完成)

MOLT DB 1 DUP(?)
	LEA SI, MOLT
	LEA DI, ANS
	IMUL AX, [SI], 20
	; IMUL  [SI] ; IMUL AX, [SI]
	MOV [DI], AX

[!FAQ] 3.8 在DATA之下存放100个无符号8位数,试编程找出其中最大的数并将其放在KVFF中

DATA DB 100 DUP(?)
KVFF DW ?
	LEA SI, DATA
	LEA DI, KVFF
	MOV CX, 100
	XOR AX, AX             ; 存放当前值
	XOR BX, BX             ; 存放最大值
LOOP:
	MOV AX, [SI]
	INC SI
	TEST AX, BX 
	JNS MAX
	DEC CX
	JZ DONE
	JMP LOOP
MAX :
	MOV BX, AX             ; 放入最大值
	DEC CX
	JZ DONE
	JMP LOOP
DONE:
	MOV [DI], BX
	HLT
	

[!FAQ] 3.9 上题中,若要求将数据按大小顺序排序,试编程序

; 交换排序
DATA DB 100 DUP(?)
KVFF DW ?
	LEA SI, DATA           ; 内层指针,用于内层遍历找出最大数
	LEA DI, DATA           ; 外层指针,用于指向目的位置的地址
	LEA BX, MAX
	MOV CX, 100            ; 内层循环计数
	MOV DX, 100            ; 外层循环计数
	XOR AX, AX             ; 存放当前值, 或用作暂存其他数
	MOV [BX], 0            ; [BX] 存放最大值为0
LOOP:
	MOV AX, SI             ; AX 记录当前数的地址 
	INC SI                 ; SI 指向下一个数
	TEST [AX], [BX]        ; 当前数与最大数比较
	JNS MAX
	
	DEC CX
	JZ DONE_LOOP
	
	JMP LOOP
	
MAX :
	MOV BX, SI             ; BX放入最大值的地址
	DEC CX                 ; 减少内层循环
	JZ DONE_LOOP
	JMP LOOP
	
DONE_LOOP:
	MOV AX, [DI]
	MOV CX, [BX]
	MOV [BX], AX
	MOV [DI], CX           ; 交换最大值与目标位置的数
	
	DEC DX                 ; 减少外层循环
	MOV CX, DX            ; 内层循环重新置数
	INC DI    
	MOV SI, DI
	
	XOR AX, AX
	MOV [BX], 0 ;
	
	JZ DONE_SORT 
	JUMP
	
DONE_SORT:
	HLT

[!FAQ] 3.10 在BVFF单元中有两位BCD数A,试编写程序计算Y,结果送DES单元,其中
Y = { 3 A ,                A < 20 A − 20 ,    20 < = A < 60 80 ,                A > = 60 Y = \begin{cases} 3A,\,\,\,\,\,\,\,\,\,\,\,\,\,\,A<20\\ A-20,\,\,20<=A<60\\ 80,\,\,\,\,\,\,\,\,\,\,\,\,\,\,A>=60 \end{cases} Y= 3A,A<20A20,20<=A<6080,A>=60

; 2位BCD数A是两个十进制数的二进制码:66 = 0110 0110 一个byte
BVFF DB 01100110
	LEA SI, BVFF
	LEA DI, DES
	XOR DX, DX
BCD2BIN:
	MOV BX, 0FH
	AND BX, [SI]
	ADD DX, BX
	MOV BX, F0H
	AND BX, [SI]
	
	MOV AX, BX
	MOV CX 16
	DIV CX
	MOV CX 10
	MUL CX
	ADD DX, BX
	
FUN:
	TEST DX, 20
	JS CONDITION1
	TEST DX, 60
	JS CONDITION2
	MOV [DI], 80
	JMP DONE
	
CONDITION1:
	MOV AX, 3
	MUL DX
	MOV [DI], AX
	JMP DONE
	
CONDITION2:
	SUB DX 20
	MOV [DI], DX
	JMP DONE
	
DONE:
	HLT

[!FAQ] 3.11 在当前数据段(DS决定)偏移地址位DATAB开始的顺序80个单元中,存放着某班80个同学某门课程的考试成绩

  • 编写程序统计大于等于90分、8089分、7079分、60~69分、小于60分的人数各为多少,并将结果放在同一数据偏移地址为BTRX开始的顺序单元
  • 求这班这门课的平均成绩(整数部分),并放在数据段的LEVT单元中
DATA SEGMENT
DATAB DB 80 DUP(?)
BTRX DB 5 DUP(0)
LEVT SB?
DATA ENDS

STACK SEGMENT PARA STACK 'STACK'
DB 100UP(?)
STACK ENDS

CODE SEGMENT
ASSUME CS: CODE, DS: DATA, ES: DATA, SS: STACK

COUNT:
	MOV SI OFFSET DATAB
	MOV DI OFFSET LEVT
	MOV CX, 80
	XOR AX, AX
	
LOOP:
	ADD AX, [SI]
	TEST [SI], 90
	JNS ABOVE_90
	TEST [SI], 80
	JNS BETWEEN_90_80
	TEST [SI], 70
	JNS BETWEEN_80_70
	TEST [SI], 60
	JNS BETWEEN_70_60
	INC [BTRX+4]
	DEC CX
	JZ: DONE
	JMP LOOP
	
ABOVE_90:
	INC [BTRX]
	DEC CX
	JZ: DONE
	JMP LOOP
	
BETWEEN_90_80:
	INC [BTRX+1]
	DEC CX
	JZ: DONE
	JMP LOOP
	
BETWEEN_80_70:
	INC [BTRX+2]
	DEC CX
	JZ: DONE
	JMP LOOP
	
BETWEEN_70_60:
	INC [BTRX+3]
	DEC CX
	JZ: DONE
	JMP LOOP
	
DONE:
	MOV DX, 80
	DIV DX
	MOV [DI], AX
	HLT
CODE ENDS
END COUNT

[!FAQ] 3.12 在当前数据段(DS决定)的DAT1和DAT2中分别存放着两个带符号的8位数,现欲求两数差的绝对值,并将其放在DAT3中,试编程

DATA SEGMENT
DAT1 DB ?
DAT2 DB ?
DAT3 DW 0
DATA ENDS

STACK SEGMENT PARA STACK 'STACK'
DB 100DUP(?)
STACK ENDS

CODE SEGMENT
ASSUME CS: CODE, DS: DATA, ES: DATA, SS: STACK
 ABS:
	LEA SI, DAT1
	MOV AL, [SI]
	LEA SI, DAT2
	MOV DL, [SI]
	LEA DI, DAT3
	
	TEST AL, DL
	JNS ABOVE
	SUB DL, AL
	MOV [DI], DL
	JMP DONE:
	
ABOVE:
	SUB AL, DL
	MOV [DI], AL
	JMP DONE:

DONE:
	HLT

[!FAQ] 3.13 试编程序将内存从40000H到4BFFFH的每个单元中均写入55H,并逐个单元读出比较,看写入与读出的是否一致。若全对,则将AL置7EH;只要有错,就将AL置81H

	MOV AX, 04000H     ; 将段地址设置为0x4000,因为实际地址=段地址*16+偏移地址,所以0x4000*0x10=0x40000
	MOV ES, AX
	XOR DI, DI
	CLD

	MOV CX, 0xC000H        ; 设置循环计数器,0BFFFh-0000h+1 = 0xC000 个单元
	
WRITE_LOOP:
	MOV AL, 55H
	MOV [DI], AL         
	INC DI
	LOOP WRITE_LOOP
	
	MOV CX, 0xC000H 
	XOR DI, DI
	
CHECK_LOOP:
	MOV AL, 55H
	CMP  AL, [DI]
	JNE ERROR
	INC DI
	LOOP CHECK_LOOP
	
	MOV AL, 7EH
	JMP DONE
ERROR:
	MOV AL, 81H
DONE: 
	HLT

[!FAQ] 3.14 接口03FBH的BIT5为状态标志,当该位为1时,表示外设忙;当其为0时,表示可以接受数据。当CPU向接口03F8H写入一个数据时,上述标志就置1;当它变为0状态时,又可以写入下一个数据
根据上述要求,编写程序,将当前数据段偏移地址为SEDAT的顺序50个单元中的数据由接口输出

SEDAT DW ?
INPORT DW 03FBH
OUTPORT DW 03F8H
	MOV SI, SEDAT
	MOV CX, 50
LOOP_START:
; 检查状态标志
	BUSY_LOOP: 
		IN AL, INPORT
		TEST AL, 20H
		JNZ BUSY_LOOP
	MOV AL, [SI]
	OUT OUTPORT, AL
	INC SI
	LOOP LOOP_START
	HLT
	

[!FAQ] 3.15 上题中,若要发送的数据由0AH结束,试重新编程序将包括0AH在内的、由偏移地址SEDAT开始的数据逐个发送出去

OUTPORT DW 03F8H
MOV SI, SEDAT ; 

SEND_LOOP: 
	MOV AL, [SI] ; 
	CMP AL, 0AH ; 
	JE END_SEND ; 如果 AL 中的值为 0AH,则跳转到结束发送的位置 
	
	OUT OUTPUT, [SI]
	
	INC SI ; 
	JMP SEND_LOOP ; 
END_SEND: 
	HLT ; 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值