[!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<20A−20,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 ;