Как изменить биты в символе в TASM?

Я должен написать программу, которая читает символы из файла, изменяя биты в каждом символе и записывая изменения в новый файл в TASM.

Я написал программу, которая читает символы из файла и записывает их в новый файл, но я не знаю, как изменить биты в символе.

Например, вот мой файл с символами:

a       // 01100001
b       // 01100010
c       // 01100011
d       // 01100100

Итак, если мы меняем первый и второй бит на 1, результат должен быть:

c       // 01100011
c       // 01100011
c       // 01100011
g       // 01100111

Как изменить биты в символе

Вот мой код:

.model small
       ASSUME CS:code, DS:data, SS:stack

stack segment word stack 'STACK'
       dw 400h dup (00)               
stack ends

data segment para public 'DATA'

    ourFile:
       dw 0FFFh
    byteInFile:
       db 00, 00, ' $'
    handle:
       dw ?
    outputTextFile:
        db 'TEXTOUT.CSV',0
    inputTextFile:
        db 'TEXT.CSV',0

data ends

writeToFile macro byte
    push ax
    push bx
    push cx
    push dx

    mov ah, 40h
    mov bx, word ptr[handle]
    mov cx, 1
    int 21h

    pop dx
    pop cx
    pop bx
    pop ax
endm
LOCALS @@

code segment para public 'CODE'

openFile proc near
    push ax
    push dx

    mov ah, 3Dh
    mov al, 00h      
    int 21h

    jc @@end
    mov word ptr ourFile, ax

    @@end:
    pop dx
    pop ax
    ret
openFile endp


closeFile proc near
    push ax
    push bx

    mov ah, 3Eh
    int 21h

    @@end:
    pop dx
    pop ax
    ret
closeFile endp


readLinesInFile proc near  
    push ax
    push dx
    push bx
    push cx
    push si
    push di

    mov si, dx
    mov di, 0               
    @@repeat:
    mov cx, 01
    mov ah, 3Fh
    int 21h
    jc @@end           
    cmp ax, 00
    je @@end           

    // here we have to change chars' bit?


    // outputting chars
    push ax
    push dx
    mov dl, byte ptr[si]
    mov ah, 02h
    int 21h
    pop dx
    pop ax

    writeToFile byte ptr[si]

    jmp @@repeat
    @@end:
    pop di
    pop si
    pop cx
    pop bx
    pop dx
    pop ax
    ret
readLinesInFile endp

    begin:

       mov ax,     seg data                   
       mov ds,     ax


       mov si, offset outputTextFile 
       mov cl, [ si ] 
       mov ch, 0      
       inc cx         
       add si, cx     
       mov al, 0
       mov [ si ], al 

       ; We create file
       mov ah, 3ch
       mov cx, 0
       mov dx, offset outputTextFile
       int 21h
       ;  save handle
       mov word ptr[handle], ax

       ; We open file
       mov dx, offset  inputTextFile
       call openFile

       mov bx, word ptr ourFile
       mov dx, offset byteInFile
       call readLinesInFile

       ; We close file
       mov bx, word ptr ourFile
       call closeFile
       jmp @@Ok

       mov ah, 3Eh                         
       mov bx, word ptr[handle]                     
       int 21h

       @@Ok:
        mov ah,     4ch                            
        int 21h

code  ends
    end begin

1 ответ

Решение

Вы можете использовать инструкцию AND установить биты в 0 и инструкцию OR установить биты в 1, примеры:

                     BIT 7    BIT 0
                        ▼      ▼
mov al, '9'   ;◄■■ AL = 00111001 (57).

Установите старший бит (7) в 1 и оставьте остальные без изменений (с помощью OR 0 оставляют биты без изменений):

                          BIT 7
        ▼                    ▼
or  al, 10000000b  ;◄■■ AL = 10111001

Теперь установите младший бит (0) в 0 и оставьте остальные без изменений (с помощью AND 1s оставляют биты без изменений):

                                 BIT 0
               ▼                    ▼
and al, 11111110b  ;◄■■ AL = 10111000

Обратите внимание, что каждая инструкция противоположна другой, OR установить 1с, AND установить 0s, OR использует маску 0 с, AND использует маску 1 с.

Вы спрашиваете, как изменить первый (0) и второй (1) бит за раз:

                                  ▼▼
mov al, 'a'       ;◄■■ AL = 01100001
or  al, 00000011b ;◄■■ AL = 01100011
              ▲▲                  ▲▲

Опять же, обратите внимание, как OR использует маску 0, чтобы оставить остальные биты без изменений. Также обратите внимание на "b" в конце двоичных чисел.

Наконец, в вашем коде вы читаете только один байт из файла, этот байт хранится в переменной byteInFile, так:

// here we have to change chars' bit?
  or byteInFile, 00000011b     ;◄■■ SET BITS 0 AND 1, LEAVE THE REST UNCHANGED.
Другие вопросы по тегам