Assembly 在8086中,我想打印输入的二进制文件并按原样打印
到目前为止我已经这样做了,但在打印时它只显示高位数字。 如何解决这个问题?我已经尝试了我所知道的一切 我想要这样的输出: 输入:101 产出:101 1(0的数量) 2(共1个) 但我得到的输出是这样的: 输入:101 产量:000 三, 0 问题是什么?如何解决?Assembly 在8086中,我想打印输入的二进制文件并按原样打印,assembly,emu8086,Assembly,Emu8086,到目前为止我已经这样做了,但在打印时它只显示高位数字。 如何解决这个问题?我已经尝试了我所知道的一切 我想要这样的输出: 输入:101 产出:101 1(0的数量) 2(共1个) 但我得到的输出是这样的: 输入:101 产量:000 三, 0 问题是什么?如何解决? 请帮我解决这个问题 .MODEL SMALL .STACK 100H .DATA D DB 0 F DB 0 C DB 0 .CODE MAIN PROC MOV AX,@DATA MOV DS,AX XOR BX
请帮我解决这个问题
.MODEL SMALL
.STACK 100H
.DATA
D DB 0
F DB 0
C DB 0
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
XOR BX,BX
MOV AH,1
INT 21H
WHILE_:
CMP AL,0DH
JE NEW_LINE
AND AL,0FH
SHL BX,1
OR BL,AL
INT 21H
INC C
JMP WHILE_
NEW_LINE:
MOV AH,2
MOV DL,0AH
INT 21H
MOV DL,0DH
INT 21H
MOV CL,1
MOV CH,0
PRINT:
CMP CH,C
JE END_
INC CH
SHL BX,CL
JC RS
MOV AH,2
MOV DL,30H
INC D
INT 21H
JMP PRINT
RS:
MOV AH,2
MOV DL,31H
INC F
INT 21H
JMP PRINT
END_:
MOV AH,2
MOV DL,0AH
INT 21H
MOV DL,0DH
INT 21H
MOV AH,2
ADD D,30H
MOV DL,D
INT 21H
MOV AH,2
MOV DL,0AH
INT 21H
MOV DL,0DH
INT 21H
MOV AH,2
ADD F,30H
MOV DL,F
INT 21H
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN
在输入端:
输入数字中的每个数字应在BX
中提供一个位。为此,您需要使用和al,1
来屏蔽,而不是您编写的和al,0Fh
WHILE_:
CMP AL, 13
JE NEW_LINE
AND AL, 1 ;This has changed!
SHL BX, 1 ;Makes room to receive a single bit
OR BL, AL ;Adds the bit
INT 21h
INC C ;Counts the inputted bits
JMP WHILE_
在输出端:
由于输入现在位于BX
的最低位,因此需要首先将这些位移到同一寄存器BX
的高端
假设BX
有16位位置,并且输入的位数在C变量中,您可以写入:
mov cl, 16 ;Total bits in BX
sub cl, C ; minus count of inputted bits
shl bx, cl ;Now inputted bits start at bit[15]
MOV CH, 0
PRINT:
CMP CH, C
JE END_
INC CH
SHL BX, 1 ;Here you shift out the highest bit
JC RS
; and so on...
老实说,我不明白你在说什么。在你描述的场景中(输入为
101
),你希望SHL BX,CL
如何生成进位?也许你想做的是SHR BX,1
,尽管你将按相反的顺序打印位。我不明白为什么你不使用中断函数,先读取字符串输入,然后检查循环中的每个字符。您的代码根本没有任何注释,也不清楚您将计数保存在哪里-只有三个存储字节D
和F
和C
,这些名称到底有多混乱?寄存器、十六进制还是什么?