如何在TASM中将char的位从一个位置移动到另一个位置?

时间:2016-12-07 22:31:06

标签: assembly tasm

我必须编写一个程序,它从文件中读取字符,在每个字符中移动位,并将这些已更改的字符写入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。这个问题有点不同。

2 个答案:

答案 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/TEST0A9h(写入" 0A"进入编辑器,导致0告诉汇编程序" A& #34;属于数字,不属于标签)10108+2 = 10 = Ah,写" 9"进入编辑器,然后添加" h"将其标记为六位值,完成。

Matt如何设法获得小数10018+1 = 9) - 我不知道,可能他使用的是计算器,或者他的头部是255-64(全面罩减去单个位)。虽然我可以通过想象头部的位模式来编写191十六进制形式。

另请阅读本文,维基文章对IMO非常好: https://en.wikipedia.org/wiki/Bitwise_operation