访问嵌入式 X86 汇编中的特定位
我正在尝试访问特定位并修改它。 我已将 0x01ABCDEF(十六进制值)移至 ecx 中,并希望能够检查特定位置的位值。 例如我必须取 0x01ABCDEF (0xEF) 的字节 0 检查位置 7 的位是否为 1 将中间 4 位设置为 1,其余设置为 0。
I am trying to acces a specific bit and modify it.
I have moved 0x01ABCDEF (hex value) into ecx and want to be able to check bit values at specific position.
For example I must take byte 0 of 0x01ABCDEF (0xEF)
check if bit at position 7 is 1
set the middle 4 bits to 1 and the rest to 0.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在 x86 下,最简单的解决方案是使用位操作指令,例如 BT(位测试)、BTC(位测试和补码)、BTR(位测试和重置)和 BTS(位测试和设置)。
位测试示例:
请记住:仅使用寄存器 edx 中的最后 5 位。
或者
在这两种情况下,结果都存储在进位标志中。
Under x86 the most simple solution is using bit manipulation instructions like BT (bit test), BTC (bit test and complement), BTR (bit test and reset) and BTS (bit test and set).
Bit test example:
Remember: only last 5 bits in register edx is used.
or
In both cases the result is stored in carry flag.
我已经完成asm很多年了,但是你想用0x80和你的值,如果结果为零,你的位没有设置,所以你跳出,否则继续,并将你的eax设置为你想要的值(我假设 例如,您所说的四位是第四个字节中的 00111100
(将其视为伪代码,因为它太长了):
It's been years since I've done asm, but you want to and your value with 0x80 and if the result is zero your bit is not set so you jump out, otherwise continue along and set your eax to the value you want (I assume the four bits you mean are the 00111100 in the fourth byte.
For example (treat this as pseudo code as it's been far too long):
大多数 CPU 不支持按位访问,因此必须使用 OR 来设置位,使用 AND 来清除位。
由于我不太熟悉汇编,所以我只会给您 C 风格的伪代码,但您应该能够轻松地将其转换为汇编指令。
并不是说您可以删除last_byte分配并直接检查
value & 0x40。然而,如果你想检查一些不是最不重要的部分,你必须先进行移位。例如,要提取 ABCD,您可以使用以下命令:
value & 0cFFFF00
获取较高有效字节 (0x01) 和>> 8
将结果左移一个字节,从而去掉最后一个字节 (0xEF)。Most CPUs do not support bit-wise access, so you have to use OR to set and AND to clear bits.
As I'm not really familiar with assembly I will just give you C-ish pseudocode, but you should easily be able to transform that to assembly instructions.
Not that you can remove the last_byte assignment and directly check
value & 0x40
. However, if you want to check something which is not the least significant part, you have to do shifting first. For example, to extract ABCD you would use the following:value & 0cFFFF00
gets rif og the more significant byte(s) (0x01) and>> 8
shifts the result left by one byte and thus gets rid of the last byte (0xEF).