linux下Intel汇编使用pushl和movq指令的问题

unixplus 2014-04-14 04:58:30
这是我的操作平台:
$ uname -a
Linux ------ 2.6.32-431.11.2.el6.x86_64 #1 SMP Tue Mar 25 19:59:55 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

一、movq指令加载内存中的数据到mmx寄存器后,在gdb中使用print命令查看mmx寄存器显示为void[/size]
汇编程序:
.section .data
intv:
.int 1, 2
bytev:
.byte 0x10, 0x05, 0xff, 0x32, 0x47, 0xe5, 0x23, 0x12
quadv:
.quad 123456
.section .text
.globl _start
_start:
nop
movq intv, %mm0
movq bytev, %mm1
movq quadv, %mm2
movl $1, %eax
movl $0, %ebx
int $0x80

编译链接:
$ as -gstabs -o mmx.o mmx.s
$ ld -o mmx mmx.o
查看
(gdb)print $mm0
$1 = void
(gdb)print $mm1
$2 = void
(gdb)print $mm2
$3 = void
为什么显示的是void而不是加载进去的值???
二、使用pushl指令出错

.section .data
value:
.int 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60
output:
.asciz "The value is %d\n"
.section .text
.globl _start
_start:
nop
movl $0, %edi
loop:
movl value(, %edi, 4), %eax
pushl %eax
pushl $output
call printf
addl $8, %esp
inc %edi
cmpl $11, %edi
jne loop
movl $0, %ebx
movl $1, %eax
int $0x80

编译出错:
$ as -gstabs -o loop.o loop.s
loop.s: Assembler messages:
loop.s:13: Error: suffix or operands invalid for `push'
loop.s:14: Error: suffix or operands invalid for `push'
网上查说加--32参数:
$ as -gstabs -o loop.o loop.s
试了下,编译通过了。
链接出错:
$ ld -o loop loop.o
loop.o: could not read symbols: File in wrong format
$ file loop.o
loop.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

请问造成上述2个问题的原因什么?该如何解决?
...全文
1318 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
unixplus 2014-06-14
  • 打赏
  • 举报
回复
引用 9 楼 mydo 的回复:
1 断点位置正确么?在15行下断,再试一下. 2 查看movq指令是否有非法参数的情况,或者浮点环境是否需要先做指令初始化.
版主,为何结贴总是提示给分与总分不符?明明给的也是40分啊
大熊猫侯佩 2014-06-02
  • 打赏
  • 举报
回复
1 断点位置正确么?在15行下断,再试一下. 2 查看movq指令是否有非法参数的情况,或者浮点环境是否需要先做指令初始化.
unixplus 2014-04-16
  • 打赏
  • 举报
回复
引用 5 楼 DelphiGuy 的回复:
要么你全部连接32位库,就可以生成32位可执行文件。
哦,刚查了下。原来这样的啊 x86-64较x86-32多了8个通用寄存器,而且,每个通用寄存器都是64位宽,它们是: rax,rbx,rcx,rdx,rsi,rdi,rsp,rbp 难怪我在gdb中查看寄存器时不是显示eax而是显示rax呢
unixplus 2014-04-16
  • 打赏
  • 举报
回复
引用 5 楼 DelphiGuy 的回复:
要么你全部连接32位库,就可以生成32位可执行文件。
怎样指定连接32位库呢,实在连接程序时制定的动态连接那里指定?
unixplus 2014-04-16
  • 打赏
  • 举报
回复
引用 4 楼 DelphiGuy 的回复:
这是因为loop.o是32位目标文件,但是连接的其他目标文件是64位的,生成不了32位可执行文件。你还是得把loop.s改成64位代码。
哦,是这样啊! 我也在想怎么把代码写成64位呢,不然这也太蛋疼了,怎么写成64位呢? 通用寄存器貌似最大就是32位的
  • 打赏
  • 举报
回复
要么你全部连接32位库,就可以生成32位可执行文件。
  • 打赏
  • 举报
回复
这是因为loop.o是32位目标文件,但是连接的其他目标文件是64位的,生成不了32位可执行文件。你还是得把loop.s改成64位代码。
unixplus 2014-04-16
  • 打赏
  • 举报
回复
引用 1 楼 DelphiGuy 的回复:
对于第二个问题,可以连接时加入参数 --oformat elf32-i386
执行命令 $ ld -dynamic-linker /lib/ld-linux.so.2 -Ic -o loop loop.o --oformat elf32-i386 提示 ld: i386 architecture of input file `loop.o' is incompatible with i386:x86-64 output loop.o:loop.s:15: undefined reference to `printf' 这是怎么回事呢? 初学汇编,望能指点下,谢谢!
unixplus 2014-04-16
  • 打赏
  • 举报
回复
执行命令 $ ld -dynamic-linker /lib/ld-linux.so.2 -Ic -o loop loop.o --oformat elf32-i386 提示 ld: i386 architecture of input file `loop.o' is incompatible with i386:x86-64 output loop.o:loop.s:15: undefined reference to `printf' 这是怎么回事呢? 初学汇编,望能指点下,谢谢!
  • 打赏
  • 举报
回复
对于第二个问题,可以连接时加入参数 --oformat elf32-i386

21,498

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧