帮忙解决一个汇编程序题

来源:百度知道 编辑:UC知道 时间:2024/06/04 06:45:20
请编制程序,其功能是:内存中连续存放着20个无符号8位二进制数,每个数为摇号机一次摇出的两个号码的压缩BCD码表示。每个号码为1至4之间的数。现统计此20次摇号中两个号码相加值分别为2、3、4、5、6、7、8的次数,将结果存入内存。
例如:
内存中有 12H,32H,31H,11H,22H,24H,41H,44H,11H,14H,
33H,21H,13H,33H,23H,42H,22H,34H,43H,11H
结果为 03H,02H,04H,04H,04H,02H,01H,
EXTRN LOAD:FAR,SAVE:FAR
N EQU 20

STAC SEGMENT STACK
DB 128 DUP(?)
STAC ENDS

DATA SEGMENT
SOURCE DB N DUP(?);顺序存放着20个字节数
RESULT DB 7 DUP(0);存放结果
NAME0 DB 'INPUT1.DAT',0
NAME1 DB 'OUTPUT1.DAT',0
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STAC
START PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX

LEA DX,SOURCE;数据区起始地址
LEA SI,NAME0;原始数据文件名
MOV CX,N;字节数
CALL LOAD;从'INPUT1.DAT'中读取数据
;****BEGIN****

ADD BL,AL
ADC BH,0
SUB BX,2
INC RESULT[BX];请问是什么意思啊?
INC SI

前四句的功能是:求出一个数的高四位和低四位的和后,寻址相应的单元,并把它加1。
add bl,al这时al的值是两个号码的和(也就是高四位和低四位的和),把al加到bx中(为了将来用bx实现基址寻址)
adc bh,0这里是把bl+al的进位加到bh中
其实这两句完全可以换成这样
mov bl,al
xor bh,bh
因为每个号码都是1~4的,相加也就是2~8,不会产生进位。

然后把bx-2,因为和为2的存放在result+0单元,和为3的存放在result+1单元……,可以发现,和与地址之间差2,把这个2减掉,再用reslut作为基地址,就可以寻址到相应的单元。

最后是inc si,修改指针,处理下一个数据

这个程序是自己写的吧?里面有很多地方都是可以优化的。