1
billlee 2016-10-15 20:24:02 +08:00
这个很复杂吗?标志寄存器表示的是上一条指令的结果的属性,所有算术指令都会修改标志寄存器
|
2
likeunix OP @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 |
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 卷 |
4
guanaco 2016-10-15 21:30:20 +08:00
现在底层也不用汇编写?
|
5
pright 2016-10-15 21:42:16 +08:00
|
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; } |
7
raptor 2016-10-15 22:09:40 +08:00
这个明显应该自己去查 Intel 的手册啊
|
8
bombless 2016-10-16 05:27:04 +08:00 via Android
intel 手册和 amd 手册交叉看吧,有时候感觉 amd 讲的更紧凑一点
|