Assembly 这种装配比较在数学上可能吗?
试图反汇编一个汇编程序,我被某个比较分支难住了 基本上我有:Assembly 这种装配比较在数学上可能吗?,assembly,Assembly,试图反汇编一个汇编程序,我被某个比较分支难住了 基本上我有: mov $0x2, %ebx lea 0xffffffe0(%ebp), %esi mov %ebx, %eax add 0xfffffff8(%esi, %ebx, 4), %eax cmp %eax, 0xfffffffc(%esi, %ebx, 4) je 8048d59 因此,最初ebx的值为2 然后%esi在帧中指向%ebp以下的8个块(字,值32)这是一个输入值,我称之为X 然后%eax获得值2 然后add函数执行:ea
mov $0x2, %ebx
lea 0xffffffe0(%ebp), %esi
mov %ebx, %eax
add 0xfffffff8(%esi, %ebx, 4), %eax
cmp %eax, 0xfffffffc(%esi, %ebx, 4)
je 8048d59
因此,最初ebx的值为2
然后%esi在帧中指向%ebp以下的8个块(字,值32)这是一个输入值,我称之为X
然后%eax获得值2
然后add函数执行:eax=2+[X+8]-8
所以X+2
现在,cmp线执行:[X+8]-4
所以X+4
现在希望我对这里语法的理解是错误的,因为上次我检查X+4时,X+2永远不会等于
-8
和-4
应用于地址,而不是值。将工具切换到intel语法,它将更具可读性:
mov ebx,0x2
lea esi,[ebp-0x20]
mov eax,ebx
add eax,DWORD PTR [esi+ebx*4-0x8]
cmp DWORD PTR [esi+ebx*4-0x4],eax
je 0x8048d6d
因此,它正在检查
x[1]==x[0]+2
lea0xfffffffe0(%ebp),%esi
-这是一个9位的十六进制数-这是一个打字错误吗?是的,很抱歉,我也这么认为,但在添加后在寄存器%eax中打印值后,它不可能做到这一点。在%esi指向的位置,存储值86。添加后,%eax包含88个。但是,在%esi下2个字,存储的十六进制值看起来是地址。正是0x0804b930或-133908176使%eax中的值变为-133908174与%esi
下面的值无关,因为x[0]
位于%esi
而x[1]
位于%esi+4
。您确实意识到2*4-8=0
和2*4-4=+4
,对吗?我认为0xFFFFFC(%esi…)意味着将0xFFFFFC添加到%esi,这将低于4…GAS也可以使用英特尔语法,但我假设您真的是指该类使用at&t。。。所以,你没有开关:)