免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1685 | 回复: 3

[Linux] AT&T汇编的问题: 把字符常量放入寄存器导致运行时崩溃! [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
发表于 2016-09-27 17:55 |显示全部楼层
我在ubuntu64位上面:
我用AT&T语法编制一个文件,简单的给al寄存器一个常量'e',然后退出。编译成32位程序:
$ cat c2.s

  1. .code32
  2. .globl _start
  3. _start:
  4. movb 'e',%al
  5. mov $1,%eax
  6. mov $0,%ebx
  7. int $0x80
复制代码
编译运行,结果崩溃:
  1. $ as -g c2.s -o c2.o && ld c2.o -o c2
  2. $ c2
  3. 段错误 (核心已转储)
复制代码
我用gdb调试c2发现是在movb 'e',%al这句话崩溃的。

于是我改换成intel语法,还是用as:
$ cat b2.s
  1. .intel_syntax noprefix
  2. .code32
  3. .section .text
  4. .global _start
  5. _start:
  6.    mov al,'e'
  7.    mov eax,1
  8.    mov ebx,0
  9.    int 0x80
复制代码
$ as -g b2.s -o b2.o && ld b2.o -o b2
$ b2
这就没有任何问题。难道我用AT&T语法有误?
谢谢。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2016-09-27 18:44 |显示全部楼层
本帖最后由 MMMIX 于 2016-09-27 18:52 编辑

回复 1# cdsfiui

%eax 是用来保存程序返回值的,你这样乱设就是和OS较劲呀。


BTW,你有用 objdump 或 gdb 的 disas 看过 gas 把 movb 'a', %al 汇编成什么了么?

评分

参与人数 1信誉积分 +10 收起 理由
cdsfiui + 10 很给力!

查看全部评分

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
发表于 2016-09-28 09:45 |显示全部楼层
MMMIX 发表于 2016-09-27 18:44
回复 1# cdsfiui

%eax 是用来保存程序返回值的,你这样乱设就是和OS较劲呀。

嗯,发现确实被编译成了别的东西。这个和我对于汇编语言的认识有出入了,我原以为除了伪指令意外,代码都是和最终的指令一一对应的。
  1. $ objdump -d c2

  2. c2:     文件格式 elf64-x86-64


  3. Disassembly of section .text:

  4. 0000000000400078 <_start>:
  5.   400078:        a0 65 00 00 00 b8 01         movabs 0x1b800000065,%al
  6.   40007f:        00 00
  7.   400081:        00 bb 00 00 00 00            add    %bh,0x0(%rbx)
  8.   400087:        cd 80                        int    $0x80

复制代码
看起来前面两个mov到ax里面的语句备合并成了一个
  1. movabs 0x1b800000065,%al
复制代码
我去掉了程序头部的.code32就没有问题了。
谢谢啊!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2016-09-28 10:43 |显示全部楼层
本帖最后由 MMMIX 于 2016-09-28 10:45 编辑

回复 3# cdsfiui

这个和我对于汇编语言的认识有出入了,我原以为除了伪指令意外,代码都是和最终的指令一一对应的。

确实是对应的,只不过你汇编的时候少传了个参数 --32 而已。

虽然加上 --32 之后,汇编的结果和源码就能对上了,但还是会 crash;问题的根子在于你写的 movb 'e', %al 这个要读取地址 0x65 ('e' 的 ASCII 码),而不是把 0x65 放入 %al,这个要写成 movb $'e', %al

评分

参与人数 1信誉积分 +10 收起 理由
cdsfiui + 10 很给力!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP