- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在阅读一个反汇编的 win32 c++ 程序,我看到了很多:
AND AL,0xFF
这是完全没有意义的还是为什么编译器会生成这些?
这是一个更长的例子:
movsx eax, byte ptr [ebx]
shl eax, 18h
movsx edx, byte ptr [ebx+1]
shl edx, 10h
add eax, edx
movsx ecx, byte ptr [ebx+2]
shl ecx, 8
add eax, ecx
movsx edx, byte ptr [ebx+3]
add eax, edx
xor edx, edx
call sub_43B55C
mov ecx, eax
mov edx, eax
sar ecx, 10h
and al, 0FFh # <----
sar edx, 8
and cl, 0FFh # <----
mov [esi], cl
and dl, 0FFh # <----
mov [esi+1], dl
mov [esi+2], al
add ebx, 4
add esi, 3
inc ebp
cmp ebp, 6
jl short loc_43B5E4
这些操作后不会检查标志,因此这不是目的。在 AND
之后,AL
、CL
和 DL
中的值被移动到 [ESI + n]
.
最佳答案
正如@fuz 所建议的,这只是优化器的错误,没有将 foo & 0xff
识别为最有可能在原始函数中使用的上下文中的空操作。
在将项目的编译设置设置为“发布”后,我使用 Borland C++ Builder 6 编译了以下代码片段:
unsigned char foobar(int foo) { return (foo >> 16) & 0xff; }
这与您提供的反汇编中执行的操作非常相似。我们有一个 32 位值,我们希望将其移位给定的位数,然后将其转换为字节值,本质上是将原始值的第 16-23 位作为一个字节返回。输入参数是 int
类型,以便生成 sar
指令而不是 shr
:很可能是 int
也在原始代码中使用。
在使用 objconv 编译和反汇编生成的 .obj 之后(因为我不知道如何从 C++ Builder 的 IDE 中启用程序集列表),我得到了这个:
@foobar$qi PROC NEAR
; COMDEF @foobar$qi
push ebp ; 0000 _ 55
mov ebp, esp ; 0001 _ 8B. EC
mov eax, dword ptr [ebp+8H] ; 0003 _ 8B. 45, 08
sar eax, 16 ; 0006 _ C1. F8, 10
and al, 0FFFFFFFFH ; 0009 _ 24, FF
pop ebp ; 000B _ 5D
ret ; 000C _ C3
@foobar$qi ENDP
如您所见,冗余的 和
仍然存在。反汇编中的 32 位立即数可以忽略不计,因为指令的编码清楚地表明实际代码流中的立即数是 8 位:反正没有其他有效的 8 位寄存器选项。
Microsoft Visual Studio C++ 6 似乎犯了同样的错误,但在整个 32 位寄存器上运行(因此由于 32 位立即数而多生成 3 个字节),清除高位 - 这是不必要的,查看函数的返回值是如何明确声明为 8 位的:
?foobar@@YAEH@Z PROC NEAR ; foobar
; 1 : unsigned char foobar(int foo) { return (foo >> 16) & 0xff; }
00000 55 push ebp
00001 8b ec mov ebp, esp
00003 8b 45 08 mov eax, DWORD PTR _foo$[ebp]
00006 c1 f8 10 sar eax, 16 ; 00000010H
00009 25 ff 00 00 00 and eax, 255 ; 000000ffH
0000e 5d pop ebp
0000f c3 ret 0
?foobar@@YAEH@Z ENDP ; foobar
与此同时,the oldest version of gcc available on godbolt正确地将其编译成本质上只是一个转变,除了由于调用约定而导致列表之间的自然差异。
关于assembly - "AND AL,0xFF"的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45361391/
我正在使用 python 检索 HTML 源,但结果看起来像这样。这是什么,为什么我没有得到实际的页面源代码? b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 5 年前。 Improve t
在寻找帮助清理某些输出的解决方案的过程中,我遇到了执行以下操作的代码。 preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\\x80-\\xff]|i',
我知道 0xff 可以根据变量类型有不同的表示。就像 -1 表示有符号(字符/整数(?))和 255 表示无符号字符。 但我使用的是与实现无关的 uint8_t 类型,并且我已确保 0xff 实际上位
我正在尝试使用波形库从波形文件中读取二进制数据。数据被读取并报告为 '\x0f\x06\x0a...' 形式的字符串文字,我想将十六进制数转换为整数(你知道,以十为基数)。我遇到的问题是这些字符串并没
我正在用 Python 3 编写代码来从 ECG 传感器读取数据。最终代码必须将从传感器接收到的数据包写入文件。这是我实际拥有的代码: import serial if __name__ == '__
1st - 有什么区别 #define s 0xFF 和 #define s '\xFF' 2nd - 为什么第二行等于-1?第三 - 为什么在我尝试这个之后(在 '\xFF' 的情况下) unsig
问题:通过iis发布的网站放到f5设备后边,通过透明监听模式waf设备过滤后,公网访问者的真实ip被waf设备ip替代,在网站日志看不到原来的真实ip了。 处理方案1:利用第三方iis插件调
我在这段代码中看到一个字符串: data[:2] == '\xff\xfe' 我不知道'\xff\xfe'是什么, 所以我想转义,但是没有成功 import cgi print cgi.escape(
如何检测空格、下划线无效?必须是一个词。但不与 [^\w\xC0-\xFF] 如果我这样做\w\xC0-\xFF 我可以检测到空间 但是我如何检测“下划线”? 输入无效:username1234 _1
我编写了一个程序来匹配随机其他数据中出现的所有特定模式的二进制数据(以十六进制工作)。它在文件中的任何位置出现大于 0 的任意次数。这是我用来进行搜索的代码,其中 f 已经以读/写模式打开: patt
为什么通过 websockets 的消息总是以 \x00 开头并以 \xff 结尾,如 \x00Your message\xff ? 最佳答案 此 documentation可能有帮助... 摘自第
所以我写了这个...... @Component class AuthenticationFailureListener : ApplicationListener{ private val
我有具有以下模式的 QRegExp QRegExp byteArray; byteArray.setPattern("[\\x00-\\xff]*"); 这是用于验证QString 的模式。有人可以提
下面是代码: def add(a,b): return a + b while True: try: a=float(input('Please enter a num
我尝试从 Web 应用程序中发现客户端是否使用透明代理。理论上应该很简单:只需检查 XFF (x-forwarder-for) header 是否存在。但是由于某些未知原因,这根本不起作用。 我在通过
在生产中遇到此错误,但无法弄清楚问题出在哪里。相同的请求适用于本地开发。但生产失败。我正在为移动客户端使用构建 API 错误跟踪 `` Encoding::UndefinedConversionErr
我正在使用 Rails 的 VPIM gem 根据用户的个人资料信息创建 vcard。 在我的本地主机上一切正常,但当我部署到 Heroku 时,应用程序崩溃了。 我在 Heroku 日志中收到以下错
我有一个程序,它返回如下字符串:b'\\xfe\\xff\\x000\\x008\\x00/\\x001\\x002\\x00/\\x001\\x009\\x009\\x003' 我怎样才能将其转换为
考虑这段代码: typedef union { int integer_; char mem_[4]; } MemoryView; int main() { MemoryVie
我是一名优秀的程序员,十分优秀!