Я хочу получить обращение 8-разрядного двоичного числа и 1 дополнение этого обращения в качестве одного выхода - PullRequest
2 голосов
/ 03 июля 2019

Я написал этот код, но я получаю только обратную строку в качестве вывода.Я хочу, чтобы дополнение 1 обратной строки также выводилось.Я знаю, как я могу получить это.Когда я редактирую свой код и готовлю его к дополнению 1 обратной строкой, моей обратной строки больше нет!

Контрольный пример:

вход: 11010110

вывод (необходим):

Перевернутая строка: 01101011 1's Дополнение к этому: 10010100

Мой код:

;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 '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                   ; jump to 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:
      SHL BL, 1                     ; shift left BL by 1 bit
      JNC ZERO                      ; jump to label ZERO if CF=0
      MOV DL, 31H                   ; set DL=1. DL=0 for 1's compelement.
      JMP DISPLAY                   ; jump to DISPLAY

     ZERO:                        
       MOV DL, 30H                 ; set DL=0. DL=1 for 1's complement.

     DISPLAY:                     
       INT 21H                     ; display digit

     LOOP OUTPUT                   ; output


     MOV AH, 4CH                   
     INT 21H
   MAIN ENDP
 END MAIN

1 Ответ

2 голосов
/ 04 июля 2019

Вы можете использовать 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 раз.

...