免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4349 | 回复: 4
打印 上一主题 下一主题

请教一个问题,怎么修改gs段寄存器的值呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-11 10:53 |只看该作者 |倒序浏览
我在汇编中用    movw $0x33,%gs

会提示Error: suffix or operands invalid for `mov'

用    movw $0x33,%ax
        movw %ax,%gs

每次汇编器都会把“movw %ax,%gs”替换成“movl   %eax,%gs”

请问这个段寄存器是不是不能修改的呢?可是运行gcc编译出来的程序,这个值总会改成0x33,它是怎么修改的呢?

论坛徽章:
0
2 [报告]
发表于 2009-08-11 16:48 |只看该作者
没太看明白你的问题,你是指gcc生成的指令直接把常量0x33写入gs?我印象中x86的段寄存器只能和特地的寄存器交互数据,不能直接写常量吗?记得以前好像用push/pop修改cs值。

论坛徽章:
0
3 [报告]
发表于 2009-08-11 18:25 |只看该作者
是这样的,因为gcc编译时会在一些含有char数组的函数中插入防止栈溢出的代码,通过
mov    %gs:0x14,%eax
mov    %eax,0xfffffff8(%ebp)
把一个固定的值保存在栈中,在函数返回时再通过
mov    0xfffffff8(%ebp),%edx
xor    %gs:0x14,%edx
比较这个值来判断是否溢出,而gcc编译生成的程序会在main函数执行前把gs寄存器的值设为0x33,并且把0xff0a0000写入%gs:0x14处。我开始时想写一个程序测试给gs赋值,但发现不能直接用movw $0x33,%gs,而用
movw $0x33,%ax
movw %ax,%gs
时生成的代码会被自动替换为
mov    $0x33,%ax
movl   %eax,%gs
可是gs是16位寄存器,为什么会替换成movl。而且只能写特定的值0x33、0x73...,如果写其他的值mov时就会出现段错误,这是为什么呢?

[ 本帖最后由 hackisle 于 2009-8-11 18:40 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-08-11 19:47 |只看该作者
不能直接写入常量应该是Arch的限制,而只能写入特定值应该是操作系统内存管理的限制。至于用movl就不清楚了,需要熟悉Intel Arch的人来回复一下了;不过用16bit的话是不是应该用ax?eax是32位的吧。

论坛徽章:
0
5 [报告]
发表于 2009-08-12 21:12 |只看该作者
谢谢了!  可是生成机器指令后再反汇编看到的却是movl   %eax,%gs,不知道是反汇编时翻译的问题还是其它的原因呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP