如何更改 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),其他保持不变(OR0保持位不变):

                          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.