我正在摆弄程序集(我的小端Linux盒子上的ATT语法),并且bswap指令存在问题。我的代码如下:
$varname = $_POST['stringName'];
注意输出:
remnux @ remnux:〜/ Assembly $ ./swap
eax现在是5
ebx现在是4
eax现在是d000000
注意,在调试时转储寄存器时,gbd显示0x5000000(预期结果)。
5在stdout中的混洗字节中变为d(十六进制13)(但不在寄存器转储中。)这告诉我第一个字节的第4位显示为(错误地?)翻转。如果我以十进制的方式执行此操作,则会出现相同的结果,虽然显然有点难以破译:5变为218103808而不是预期的83886080.只需添加2 ^ 27到83886080即可看到发生了什么。
这是预期的,为什么?请注意,我在64位Ubuntu VM上使用32位代码:
remnux @ remnux:〜/ Assembly $ uname -m
x86_64的
答案 0 :(得分:5)
EAX中的值不会在函数调用中保留。实际上printf
将在EAX中返回一个值,即写入的字符数。在这种情况下,为13,ebx is now 4
中的字符数加上换行符。因此,您将字节交换printf
的返回值,而不是之前加载到EAX中的值。