gs上的bswap结果可能不正确

时间:2016-02-27 18:56:15

标签: assembly architecture

我正在摆弄程序集(我的小端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的

1 个答案:

答案 0 :(得分:5)

EAX中的值不会在函数调用中保留。实际上printf将在EAX中返回一个值,即写入的字符数。在这种情况下,为13,ebx is now 4中的字符数加上换行符。因此,您将字节交换printf的返回值,而不是之前加载到EAX中的值。