Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 这种装配比较在数学上可能吗?_Assembly - Fatal编程技术网

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。。。所以,你没有开关:)