请用8086汇编语言编写完整程序:求一个数据块(由20个单字节的带符号数组成)中的正数之和(和不超过字)和负数之和(和不超过字),并在屏幕上用十进制数的形式分别显示出两个和。
时间: 2024-02-04 13:02:55 浏览: 288
很高兴为您解答这个问题。以下是符合您要求的8086汇编语言程序:
```
DATA SEGMENT
NUMBERS DB 10, -20, 30, -40, 50, -60, 70, -80, 90, -100, 110, -120, 130, -140, 150, -160, 170, -180, 190, -200
DATA ENDS
SUMS SEGMENT
POS_SUM DW ?
NEG_SUM DW ?
SUMS ENDS
CODE SEGMENT
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV CX, 20
MOV BX, 0
MOV DX, 0
LOOP_START:
MOV AL, [NUMBERS+BX]
CMP AL, 0
JS NEGATIVE
ADD DX, AX
JMP CONTINUE
NEGATIVE:
ADD BX, 1
MOV AL, [NUMBERS+BX]
SUB DX, AL
CONTINUE:
ADD BX, 1
LOOP LOOP_START
MOV AX, DX
SAR AX, 1
MOV [POS_SUM], AX
MOV AX, DX
NEG AX
SAR AX, 1
MOV [NEG_SUM], AX
CALL DISPLAY_RESULTS
MOV AH, 4CH
INT 21H
DISPLAY_RESULTS:
MOV AX, [POS_SUM]
CALL DISPLAY_DECIMAL
MOV DL, ' '
MOV AH, 2H
INT 21H
MOV AX, [NEG_SUM]
CALL DISPLAY_DECIMAL
MOV DL, ' '
MOV AH, 2H
INT 21H
RET
DISPLAY_DECIMAL:
PUSH BX
PUSH CX
PUSH DX
MOV BX, 10
XOR CX, CX
DIV BX
PUSH AX
MOV AH, 0
MOV AL, CL
ADD AL, '0'
MOV DL, AL
MOV AH, 2H
INT 21H
POP AX
MOV CL, AH
XOR CH, CH
CMP AX, 0
JNZ DISPLAY_DECIMAL_DONE
POP DX
POP CX
POP BX
RET
DISPLAY_DECIMAL_DONE:
JMP DISPLAY_DECIMAL
MAIN ENDP
CODE ENDS
END MAIN
```
这个程序将数据块存储在 `NUMBERS` 中,将正数之和存储在 `POS_SUM` 中,将负数之和存储在 `NEG_SUM` 中。它使用一个循环来迭代每个数字,并根据它是正数还是负数来更新相应的和。最后,它调用 `DISPLAY_RESULTS` 子例程来在屏幕上显示两个和。`DISPLAY_RESULTS` 子例程将使用 `DISPLAY_DECIMAL` 子例程来将数字转换为十进制格式,并通过 `INT 21H` 中断来输出它们。
请注意,这个程序假设和不会超过一个字,因此它在计算正数和和负数和时使用 `ADD` 和 `SUB` 指令,而不是 `ADC` 和 `SBB` 指令。如果和可能超过一个字,请改用 `ADC` 和 `SBB` 指令。
阅读全文