忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
楼主: ethantsien

[C] c中内嵌汇编movl cr3出错 [复制链接]

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:412015年辞旧岁徽章
日期:2015-03-03 16:54:15拜羊年徽章
日期:2015-03-03 16:15:432015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2012-10-06 14:38 |显示全部楼层
folklore 发表于 2012-10-06 14:32
**
มั้้้้้้้้้้้ŭ ...

google.

**劣质的钛银手镯
**小苏打卖
**幻象染料
**卖百合
**卖罗汉果
**卖艾条
**电子书下载
**金镖鱼群
**星木
**卖迷魂药

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:412015年辞旧岁徽章
日期:2015-03-03 16:54:15拜羊年徽章
日期:2015-03-03 16:15:432015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2012-10-06 14:42 |显示全部楼层

论坛徽章:
0
发表于 2012-10-06 14:44 |显示全部楼层
回复 12# folklore


    朋友,这个是什么?

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:412015年辞旧岁徽章
日期:2015-03-03 16:54:15拜羊年徽章
日期:2015-03-03 16:15:432015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2012-10-06 14:52 |显示全部楼层
it is the reason that "哪>>里>>" be blocked.

哪>>里>>有压迫哪>>里就有反抗

by the way.
movl %cr3 is valid, but can't work in user mode,
i think there are some compiling option can override it.
but i am not really sure...

by the way once more:
try

  1. __asm__ __volatile__ ("movl %%cr3, %%eax;\r\n movl %%eax,%0" : "=r" (b));
复制代码
instead?

to @captivated : cr3 can be read, some case the code to access cr3 may be:

  1. movl %cr3,%eax
  2. or $0x01,%eax
  3. movl %eax,%cr3
复制代码

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:412015年辞旧岁徽章
日期:2015-03-03 16:54:15拜羊年徽章
日期:2015-03-03 16:15:432015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2012-10-06 15:01 |显示全部楼层
i try the following code in vs2008, it can be compiling but lead to run-time failure:;

  1. int main(){
  2.         __asm{
  3.                 mov eax,cr3
  4.         }
  5.         return 0;
  6. }
复制代码

论坛徽章:
2
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31
发表于 2012-10-06 15:38 |显示全部楼层
回复 9# ethantsien


    嗯. 那么LZ的结论呢, 是什么? 我可以十分肯定确定以及一定地保证, 这种东西如果不是语法或者用法问题, 绝对不会在编译期报错.

    被你逼着去查Intel说明书第三卷了.
    以下内容出自Intel说明书第三卷Chapter2 Section2.5, 控制寄存器.

    2.5 CONTROL REGISTERS
    Control registers (CR0, CR1, CR2, CR3, and CR4; see Figure 2-6) determine operating mode of the processor and the characteristics of the currently executing task. These registers are 32 bits in all 32-bit modes and compatibility mode.In 64-bit mode, control registers are expanded to 64 bits. The MOV CRn instructions are used to manipulate the register bits. Operand-size prefixes for these instructions are ignored. The following is also true:
    • Bits 63:32 of CR0 and CR4 are reserved and must be written with zeros. Writing a nonzero value to any of the upper 32 bits results in a general-protection exception, #GP(0).
    • All 64 bits of CR2 are writable by software.
    • Bits 51:40 of CR3 are reserved and must be 0.
    • The MOV CRn instructions do not check that addresses written to CR2 and CR3 are within the linear-address or physical-address limitations of the implemen-tation.
    • Register CR8 is available in 64-bit mode only.
    ... 剩下的不再copy了, 请LZ自己去查.

    简略的大体意思是, 控制寄存器cr0 -- cr4, 在64位长模式中都是64位, 在兼容32位模式下则为(可见)32位. MOV CRn指令用于操作寄存器位. 这些指令的操作数尺寸前缀被忽略.
==========================================================

    接下来是关于LZ的语法或者用法分析. 我们知道movl或者movq只是汇编器为了方便使用者给的助记符. 这些助记符会被落实到实际的二进制指令上面. 汇编器中同样一个MOV指令, 翻译成为二进制指令后可能根本是不一样的指令.

    那么Intel的二进制指令格式是怎么样的呢? x86是变长指令集, 其二进制指令格式如下(关于这个指令格式, LZ可以看Richard Blum所著《汇编语言程序设计》, 亦或, 直接参看Intel说明书前面两卷. 本人很讨厌看manual, 因此本人是看的前者. 一般来说程序员感兴趣的只是第三卷, 因为第三卷才是关于CPU编程模型Programming Model的):

    指令前缀 操作码 ModR/M SIB 移位 数据元素

    这个指令中各部分占多少bits不是我们关心的内容; 总之一个指令的最长长度不会超过15字节(Intel是变长复杂指令集构架, 也就是其指令集每个指令长度是不确定的). 稍微关心下指令前缀的作用:
    1. 锁定前缀和重复前缀(锁总线保证原子操作, 以及串操作常用的重复功能)
    2. 段覆盖/段超越前缀(还记得8086吧, 就是起那个作用的. 顺便, 即使64位CPU, cs ds ss等仍为16 bits, 它们在应用层出场机会已经几乎为0, 操作系统是要用的, 因为操作系统要把所有的段的段基址都设定为0, 从而使这个段式管理透明.)
    3. 操作数长度覆盖前缀
    4. 地址长度覆盖前缀

    没错, 我们要关心的是3和4, 这两个前缀会指定操作数的长度和地址长度.

==========================================================

    综合上面两个, 以及看说明书和指令格式说明之后, 我们可以确定的事情是, movl movq, 转换为真正的二进制指令后, 其指令的前缀部分关于操作数尺寸之类的被忽略. 但它是说长度被忽略, 并不代表长度不确定, 因为cr3的长度就是那个长度, 代表使用者自己要用对.
    那么LZ的报错在编译期, 这要考查LZ的系统环境. 如果LZ是64位系统, 用的也是64位编译器, 那么gas会判定cr3是64 bits, 应该mov到一个能够存储64bits的变量中去. 你声明的是int b, 这显然不能够存储64 bits(64位Linux系统采用LP模式, 指针长度和long类型变量长度相同). 所以LZ可以试试声明b为unsigned long. 关于movl还是movq, LZ也可以试试 -- 改改看能不能编译通过是不, 举手之劳. 关于LZ的报错提示, 也很明显地指出是你的汇编指令后缀(mov + l还是mov + q啦)或者是你某个操作数有问题(有问题的操作数不一定就是cr3嘛).

==========================================================

    虽然, 我很闲得淡腾地刷贴, 但是, 本人也要声明一个. 以上结论仅供参考. 我不做完全的正确性保证. 当然, 本人的引用是有正确性保证的. 另外, 我对自己编译期和运行期应该哪个地方报错之类的事情是很有自信的 -- 如果确实还有别的因素, 请CU的达人指教, 欢迎之至.

论坛徽章:
2
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31
发表于 2012-10-06 15:44 |显示全部楼层
回复 15# folklore


    It doesn't make sense.

    I've said that IT DO LEAD TO FAILURE if you try to RUN IT. yeah, I know it, of course.

    But the error is, raised at compile time by the description of LZ.

    So, what's the real thing?

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:412015年辞旧岁徽章
日期:2015-03-03 16:54:15拜羊年徽章
日期:2015-03-03 16:15:432015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2012-10-06 15:51 |显示全部楼层
回复 17# captivated


1. the compiler prevent to compile this code (mov %cr3)
2. the asm code "movl %cr3,variant" is bad form, the good form is:

  1. movl %cr3,%eax
  2. movl %eax,variant
复制代码

论坛徽章:
2
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31
发表于 2012-10-06 15:55 |显示全部楼层
回复 18# folklore


    yeah. you got it. I think maybe this is the only reason.

    by the way. no compile option can override the privilege: They are different category.

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:412015年辞旧岁徽章
日期:2015-03-03 16:54:15拜羊年徽章
日期:2015-03-03 16:15:432015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2012-10-06 15:59 |显示全部楼层
回复 16# captivated


    [qutote]

    接下来是关于LZ的语法或者用法分析. 我们知道movl或者movq只是汇编器为了方便使用者给的助记符. 这些助记符会被落实到实际的二进制指令上面. 汇编器中同样一个MOV指令, 翻译成为二进制指令后可能根本是不一样的指令.
[/quote]
i agree with it, by the way, movl & movq is different instruction.

    综合上面两个, 以及看说明书和指令格式说明之后, 我们可以确定的事情是, movl movq, 转换为真正的二进制指令后, 其指令的前缀部分关于操作数尺寸之类的被忽略. 但它是说长度被忽略, 并不代表长度不确定, 因为cr3的长度就是那个长度, 代表使用者自己要用对.
     那么LZ的报错在编译期, 这要考查LZ的系统环境. 如果LZ是64位系统, 用的也是64位编译器, 那么gas会判定cr3是64 bits, 应该mov到一个能够存储64bits的变量中去. 你声明的是int b, 这显然不能够存储64 bits(64位Linux系统采用LP模式, 指针长度和long类型变量长度相同). 所以LZ可以试试声明b为unsigned long. 关于movl还是movq, LZ也可以试试 -- 改改看能不能编译通过是不, 举手之劳. 关于LZ的报错提示, 也很明显地指出是你的汇编指令后缀(mov + l还是mov + q啦)或者是你某个操作数有问题(有问题的操作数不一定就是cr3嘛).

i think both

  1. movl %cr3,%eax
  2. movq %cr3,%rax
复制代码
are valid.
the length of data that be accessed is depending on the instrucment (movl / Movq).
but some register can't support it, i don't know if it include cr3
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP