我必须编写一个程序,它从文件中读取字符,在每个字符中移动位,并将这些已更改的字符写入TASM中的新文件。
我已经编写了一个程序,它从文件中读取字符并将它们写入新文件,但我不知道如何在字符中移动位。
例如,这里将是我们带有字符的文件:
▼ ▼
! // 00100001
" // 00100010
# // 00100011
$ // 00100100
这将是我们的新文件,其中包含更改的字符(第2位转到第7位):
▼ ▼
! // 00100001
b // 01100010
c // 01100011
$ // 00100100
如何在TASM中的char中移动该位?
编辑:
这不是How to change bits in a char in TASM?的重复问题,因为我需要检测所需的位是0还是1,知道要使用什么,OR或AND,然后在1中设置正确的位,其余的在0中,或0中的正确位和1中的其余位,然后执行OR或AND。这个问题有点不同。
答案 0 :(得分:2)
为此,请测试"来源"通过屏蔽除了要测试的位之外的所有内容,然后根据结果值是否为零有条件地进行分支。然后你可以设置或清除"目的地"位。
因此,例如,假设您的char在AL寄存器中,
TEST AL,2 ; TEST sets zero flag if the result of ANDing is zero,
JZ BIT_IS_ZERO ; so there is no need to do a separate CMP
; not zero, so fall through to BIT_IS_ONE, no need for a JMP
BIT_IS_ONE:
OR AL,64 ; set bit 7; define constant make easier to understand
JMP DONE
BIT_IS_ZERO:
AND AL,191 ; mask off bit 7; ditto on defining constant for this
; fall through to DONE, no need for a JMP here
DONE:
根据您定位的芯片,您可能需要使用AND而不是TEST。 AND修改要测试的寄存器,因此在设置/清除位之前,您必须保留另一个副本并加载它,否则它是相同的。
您还可以使用SHL,使用AND清除除了您关注的所有位之外的所有位,然后使用SHL将剩余位(无论是0还是1)从第2位移位到第7位,然后清除"目的地" char(一个单独的副本),最后OR两个在一起。我上面提供的方法可能更容易理解和实现,但它确实引入了使用SHL时不必要的分支指令,因此它的效率低于SHL。
答案 1 :(得分:1)
最直接的文字重写英语句子"将第二位复制到第7位"进入8086大会,我能想到:
SELECT Name FROM table WHERE Replace(Number,'-','') = '22233'
关于位掩码常量计算:
当你有 mov al,char ; input value
mov ah,al ; copy of value for 2nd bit extraction
and ah,0b00000010 ; keep only 2nd bit in copy
; ^ and ah,2 if your assembler doesn't support "0b"
shl ah,5 ; move 2nd bit to position of 7th bit
and al,0b10111111 ; clear 7th bit in char
; ^ and al,0BFh if your assembler doesn't support "0b"
or al,ah ; merge "second bit" into cleared one at 7th
= 8位掩码之类的二进制值时,1010 1001
使用它时,它将保持原始值,其中" 1"在掩码中设置,它将清除" 0"是
如果您知道AND
指令要操纵哪一位,那就应该很容易想象,例如"显而易见"。
但是你不想在汇编程序中输入这么长的二进制数(如果你使用一些过时的数字,它甚至都不会为你编译它)......所以把它写成六进制{{1} }。它就像"显而易见的"作为二进制数,只有每4位形成一个十六进制数字,因此AND/OR/XOR/TEST
为0A9h
(写入" 0A"进入编辑器,导致0告诉汇编程序" A& #34;属于数字,不属于标签)1010
是8+2 = 10 = Ah
,写" 9"进入编辑器,然后添加" h"将其标记为六位值,完成。
Matt如何设法获得小数1001
(8+1 = 9
) - 我不知道,可能他使用的是计算器,或者他的头部是255-64(全面罩减去单个位)。虽然我可以通过想象头部的位模式来编写191
十六进制形式。
另请阅读本文,维基文章对IMO非常好: https://en.wikipedia.org/wiki/Bitwise_operation