pat*_*626 1 architecture assembly
我正在摆弄程序集(我的小端Linux盒子上的ATT语法),并且bswap指令存在问题.我的代码如下:
.code32
.section .data
stringa:
.asciz "eax is now %x\n"
stringb:
.asciz "ebx is now %x\n"
.section .text
.globl main
main:
movl $4, %eax
movl $5, %ebx
xchg %eax, %ebx
pushl %eax
pushl $stringa
call printf
add $8, %esp
pushl %ebx
pushl $stringb
call printf
add $8, %esp
bswap %eax
pushl %eax
pushl $stringa
call printf
add $8, %esp
call exit
Run Code Online (Sandbox Code Playgroud)
注意输出:
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的
EAX中的值不会在函数调用中保留.实际上printf会在EAX中返回一个值,即写入的字符数.在这种情况下,这是13,ebx is now 4加上换行符的字符数.因此,您将字节交换返回值printf而不是先前加载到EAX中的值.
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |