V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
likeunix
V2EX  ›  Linux

有介绍 i386 汇编中各类指令对标志寄存器影响的书或博客吗?

  •  1
     
  •   likeunix · 2016-10-15 20:00:02 +08:00 via Android · 2212 次点击
    这是一个创建于 1830 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在看《深入了解计算机系统》,讲到汇编那一章,发现书上对各类指令对标志寄存器的影响讲的不细致,所以来问问大家有没有这方面的书或资料介绍一下。
    在做习题的时候发现有的知识点书上没讲到, google 也没找到~~
    这就像老师上课讲加法考试却考你乘法。
    8 条回复    2016-10-16 05:27:04 +08:00
    billlee
        1
    billlee   2016-10-15 20:24:02 +08:00
    这个很复杂吗?标志寄存器表示的是上一条指令的结果的属性,所有算术指令都会修改标志寄存器
    likeunix
        2
    likeunix   2016-10-15 20:55:19 +08:00 via Android
    @billlee 看下这个,我不知道第 7 行执行后标志寄存器发生了什么变化:
    1 movl 8(%ebp),%edx
    2 movl $0,%eax
    3 testl %edx,%edx
    4 je .L7
    5 .L10:
    6 xorl %edx,%eax
    7 shrl %edx
    8 jne .L10
    9 .L7:
    10 andl $1,%eax
    redsonic
        3
    redsonic   2016-10-15 21:09:16 +08:00   ❤️ 1
    intel x86 架构手册,没有比这个更权威的了
    http://www.intel.cn/content/www/cn/zh/processors/architectures-software-developer-manuals.html

    shrl 可能在 2B 卷
    guanaco
        4
    guanaco   2016-10-15 21:30:20 +08:00
    现在底层也不用汇编写?
    billlee
        6
    billlee   2016-10-15 21:56:52 +08:00   ❤️ 1
    你这里 %edx 是个变量啊,就是在循环里面做右移,当结果不为 0 时, ZF 为 1, 执行 jne .L0, 循环
    直到 %edx 为 0 的时候, ZF 为 0, jne .L0 不执行,退出循环

    void f(uint32_t val) {
    uint32_t sum = 0;
    while (val != 0) {
    sum ^= val;
    val >>= 1;
    }
    sum &= 1;
    }
    raptor
        7
    raptor   2016-10-15 22:09:40 +08:00
    这个明显应该自己去查 Intel 的手册啊
    bombless
        8
    bombless   2016-10-16 05:27:04 +08:00 via Android
    intel 手册和 amd 手册交叉看吧,有时候感觉 amd 讲的更紧凑一点
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1296 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:01 · PVG 02:01 · LAX 11:01 · JFK 14:01
    ♥ Do have faith in what you're doing.