Tag: ia 32

IA32注册地址

我有几个互相关联的问题让我失望。 我正在进行一项任务,我必须在gdb查看汇编代码,以找到使C程序正常工作的正确输入。 为了测试这个,我输入一个由一些数字组成的测试字符串,并逐步读取/读取程序集以预测其行为并找出解决方案。 这是主要问题:在某一点上,我的整个输入字符串存储在%eax寄存器中。 我打电话的时候: x/a $eax 它返回一个hex,我假设它是%eax的地址。 此时,hex的最后一个字节会根据输入而变化。 程序在输入字符串上调用strtol()后不久,从字符串中删除第一个数字,并将缩短的字符串放回%eax 。 事情变得令人困惑:似乎无论原始输入有多长或附加输入有多长,当我在$eax上调用x/a时,返回的hex值的最后一个字节似乎总是等于32。是一个问题,因为在使用%eax地址的最后一个字节之后不久有一个cmp测试,而数字32会导致程序故意崩溃。 我误解了x/a的使用,事实上,我返回的hex根本不是一个地址吗? 输入的大小是否会影响注册表的地址? 任何其他有用的提示可以帮助我在这种情况下? 非常感谢

为什么__sync_add_and_fetch适用于32位系统上的64位变量?

请考虑以下压缩代码: /* Compile: gcc -pthread -m32 -ansi xc */ #include #include #include static volatile uint64_t v = 0; void *func (void *x) { __sync_add_and_fetch (&v, 1); return x; } int main (void) { pthread_t t; pthread_create (&t, NULL, func, NULL); pthread_join (t, NULL); printf (“v = %”PRIu64″\n”, v); return 0; } 我有一个uint64_t变量,我想以primefaces方式递增,因为该变量是multithreading程序中的计数器。 为了达到primefaces性,我使用了GCC的primefaces内核 。 如果我编译amd64系统(-m64),生成的汇编代码很容易理解。 […]