Как изменить биты в символе в 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.