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
注意输出:
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 次 | 
| 最近记录: |