我对汇编语言编程非常陌生,我目前正在尝试阅读从二进制文件生成的汇编语言.我跑过去了
test %eax,%eax
Run Code Online (Sandbox Code Playgroud)
或者test %rdi, %rdi
等等.我很困惑这是做什么的.这些价值不%eax, %eax
一样吗?什么是测试?我在某处读到它正在进行AND
操作.....但由于它们是相同的值,它不会只返回%eax
吗?
以下是我发现此用法的一个实例:
400e6e: 85 c0 test %eax,%eax
400e70: 74 05 je 400e77 <phase_1+0x23>
Run Code Online (Sandbox Code Playgroud)
je
如果被比较的两个值相等,我认为跳跃......好吧,因为 %eax
很好,本身,在什么情况下我们不会跳?
我是一般的编程初学者,所以如果有人能向我解释这一点,我会非常感激.谢谢!
我想了解一些装配.
汇编如下,我对该testl
行感兴趣:
000319df 8b4508 movl 0x08(%ebp), %eax
000319e2 8b4004 movl 0x04(%eax), %eax
000319e5 85c0 testl %eax, %eax
000319e7 7407 je 0x000319f0
Run Code Online (Sandbox Code Playgroud)
我想了解的那点testl
之间的%eax
和%eax
?我认为这段代码的具体内容并不重要,我只是试图用自己来理解测试 - 这种价值总是不正确吗?
我一直在撞墙撞墙,这对我来说毫无意义......
我想你可以使用test
为相等比较两个值,如图所示这里 ......为什么不工作?
int main()
{
__asm
{
mov EAX, 1;
mov EDX, EAX;
test EAX, EDX;
L: jne L;
}
}
Run Code Online (Sandbox Code Playgroud) 我想知道这个操作意味着什么?
Test EDX, 200
Run Code Online (Sandbox Code Playgroud)
我DWORD
有价值EDX
:
1A1B1C00
Run Code Online (Sandbox Code Playgroud)
当我做test EDX, 200
,然后a JE
,跳跃.为什么?EDX
不等于200
.
我想更多地了解Test EDX, 200
意义.
我正在做家庭作业.我们给出了一个预编译的二进制文件,我们必须使用它gdb
来获取程序集转储,遍历数据结构,查看存储在内存中的值等,以便弄清楚二进制文件的功能.以下是函数调用的几行反汇编转储:
0x08048e14 <+21>: test %esi,%esi
0x08048e16 <+23>: jne 0x8048e4b <fun6+76>
0x08048e18 <+25>: jmp 0x8048e5d <fun6+94>
Run Code Online (Sandbox Code Playgroud)
我假设test %esi,%esi
总是返回"equals"的结果(或者更确切地说,使用寄存器标志表示的等效语句,我认为只是ZF
设置了吗?),并且jne
指令永远不会执行,而程序将执行在线指令<+25>
.但是,在单步执行这些指令后,程序会跳转到行<+76>
!为什么会这样?我很困惑.
如果它有助于解释答案,这里是test
在线指令后的寄存器标志<+21>
(ZF
未设置?)(我仍然不知道如何解释标志):
eflags 0x202 [ IF ]
Run Code Online (Sandbox Code Playgroud)