如何更改 TASM 中 char 中的位?
How to change bits in a char in 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
您可以使用指令 AND
将位设置为 0,使用指令 OR
将位设置为 1,示例:
BIT 7 BIT 0
▼ ▼
mov al, '9' ;◄■■ AL = 00111001 (57).
设置1中的最高位(7),其他保持不变(OR
0保持位不变):
BIT 7
▼ ▼
or al, 10000000b ;◄■■ AL = 10111001
现在设置0中的最低位(0)并保持其他不变(AND
1s保持位不变):
BIT 0
▼ ▼
and al, 11111110b ;◄■■ AL = 10111000
注意每条指令是如何与其他指令相反的,OR
设置 1,AND
设置 0,OR
使用 0 的掩码,AND
使用 1s 的掩码。
您问如何一次更改第一 (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.
我必须编写一个程序,从文件中读取字符,更改每个字符中的位,然后将更改写入 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
您可以使用指令 AND
将位设置为 0,使用指令 OR
将位设置为 1,示例:
BIT 7 BIT 0
▼ ▼
mov al, '9' ;◄■■ AL = 00111001 (57).
设置1中的最高位(7),其他保持不变(OR
0保持位不变):
BIT 7
▼ ▼
or al, 10000000b ;◄■■ AL = 10111001
现在设置0中的最低位(0)并保持其他不变(AND
1s保持位不变):
BIT 0
▼ ▼
and al, 11111110b ;◄■■ AL = 10111000
注意每条指令是如何与其他指令相反的,OR
设置 1,AND
设置 0,OR
使用 0 的掩码,AND
使用 1s 的掩码。
您问如何一次更改第一 (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.