Вы можете использовать ROL
вместо SHL
в строке 52, чтобы сохранить обратное значение в регистре BL
.Теперь вы можете использовать его позже для вывода значения дополнения 1 следующим образом:
MOV CX, 8 ; For looping 8 times
MOV AH, 2
_OUTPUT_INVERSE:
ROL BL, 1 ; Rotate left by 1 bit
JC _I_ZERO ; jump to label ZERO if CF=1
MOV DL, 31H ; set DL=1. DL=0 for 1's compelement.
JMP _I_DISPLAY ; jump to DISPLAY
_I_ZERO:
MOV DL, 30H ; set DL=0. DL=1 for 1's complement.
_I_DISPLAY:
INT 21H
LOOP _OUTPUT_INVERSE ; output the inverse
Это работает, потому что после того, как вы напечатали обратное значение, регистр BL
содержит 6B
(то есть. 01101011
).Таким образом, простое смещение (или вращение) значения, оставленного по одному разу в каждом цикле, даст использование обратного значения по одному, которое печатается, как и раньше, с обратным значением.
Полный код: (используя ваш стиль)
;REVERSING 8-BIT BINARY NO.
.MODEL
.STACK 100H
.DATA
STR DB 'Enter the binary number (max 8-bit) : $'
STR2 DB 0DH,0AH,'REVERSED STRING : $'
STR3 DB 0DH,0AH,'THE 1S COMPLEMENT OF IT: $'
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
LEA DX, STR ; display STR
MOV AH, 9
INT 21H
XOR BL, BL ; CLEAR BL
MOV CX, 8 ; loop for 8 times
MOV AH, 1
INPUT:
INT 21H
CMP AL, 0DH ; compare digit with carriage return (ENTER)
JZ END ; jump to END, if carriage return (JUMP IF ZERO)
AND AL, 01H ; convert ascii to decimal code
SHL BL, 1 ; rotate BX to left by 1 bit
OR BL, AL ; set the LSB of BX with input
LOOP INPUT ; loop INPUT
END:
MOV AL, BL ; copy BL into AL
MOV CX, 8 ; loop for 8 times
LP: ; loop
SHL AL, 1 ; shift AL to left by 1 bit
RCR BL, 1 ; rotate BL right through carry
LOOP LP ; jump to LP
LEA DX, STR2 ; load and display STR2
MOV AH, 9
INT 21H
MOV CX, 8
MOV AH, 2 ; output function
OUTPUT_REVERSE:
ROL BL, 1 ; rotate left BL by 1 bit
JNC ZERO ; jump to label ZERO if CF=0
MOV DL, 31H ; set DL=1. DL=0 for reversing the value.
JMP DISPLAY ; jump to DISPLAY
ZERO:
MOV DL, 30H ; set DL=0. DL=1 for reversing the value.
DISPLAY:
INT 21H ; display digit
LOOP OUTPUT_REVERSE ; output reverse value
LEA DX, STR3 ; load and display STR3
MOV AH, 9
INT 21H
MOV CX, 8
MOV AH, 2 ; output function
OUTPUT_INVERSE:
ROL BL, 1 ; rotate left by 1 bit
JC I_ZERO ; jump to label ZERO if CF=1
MOV DL, 31H ; set DL=1. DL=0 for 1's compelement.
JMP I_DISPLAY ; jump to DISPLAY
I_ZERO:
MOV DL, 30H ; set DL=0. DL=1 for 1's complement.
I_DISPLAY:
INT 21H
LOOP OUTPUT_INVERSE ; output the inverse value
MOV AH, 4CH
INT 21H
MAIN ENDP
END MAIN
Вывод:
Enter the binary number (max 8-bit) : 11010110
REVERSED STRING : 01101011
THE 1S COMPLEMENT OF IT: 10010100
Кстати, вам не нужны строки 26 и 27, так как циклработает только 8 раз.