【发布时间】:2021-03-01 08:28:46
【问题描述】:
所以我需要过滤掉正数,如果小于 FFH 则显示总和,如果不显示 FFH。我在模拟器中输入代码并使用#DB 将数字存储在特定的内存位置。 但是当我一步一步运行它时,内存内容寄存器显示为00。如何解决它?
MVI B,00
MVI C,0A
LXI H,4000
NEXT: MOV A,M
RAL
JC REJECT
RAR
ADD B
JC OVR
MOV B,A
REJECT: INX H
DCR C
JNZ NEXT
STA 8070
OVR: MVI A,FF
HLT
# ORIGIN 4000H
# DB 28H, D8H, C2H, 21H, 24H, 30H, 2FH, 19H, F2H, 9FH
GNUSim8085
【问题讨论】:
-
你应该指定你正在使用的汇编程序。
-
添加任何两个负数总是会产生结转。这与签名溢出不同。 IIRC 8080 / 8085 没有标志,所以相当不方便。但是在任何给定的加法中,如果添加两个负数会产生一个正数,那就是有符号溢出。
-
另外,
0xFF是-1,最大/最大负数(在 2 的补码中)。所以指令告诉你显示总和,除非总和是 0xFF,然后显示 FF。所以你总是必须显示精确的总和,比如用扩展精度来处理一个 2 字节的总和? -
或者您是否应该只保留正数,而不是删除它们,并将总和视为无符号数?这使得溢出检测和处理变得更加容易。