|
主题 : : 这样的代码是正确的还是错误的?有关32位寄存器 [待解决] |
回复[ 8次 ]
点击[ 707次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2012-08-02 09:00 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-04-30 21:05 |
在看雪论坛的KSSD上看到一篇代码优化的帖子(在“第1篇 基础篇”-“汇编基础”-“汇编指令”-“代码优化常识”网址:http://www.pediy.com/kssd/)
在第6个优化方法时出现了类似于“mov eax, 50h”“push 50h”“pop eax”“push eax”的语句。
但根据《汇编语言(第二版)》第19页,在位数不同的两个寄存器之间传送数据的指令是错误的指令。
eax好像是32位寄存器吧。那么8位的数据怎么能存进32位寄存器?8位怎么能压到16位的栈中?16位的栈怎么又能弹到32位的寄存器中?32位的寄存器怎么又能压到16位的栈中?
即使后面几个压栈出栈的语句位数不对也可以压,但“mov eax, 50h”总是矛盾的。
这个是错误呢,还是32位寄存器不能用16位寄存器类比?还是CPU在后来的指令集中允许了位数不相同也可以操作? | | |
|
|
|
|
[第1楼]
[ 回复时间:2012-08-02 11:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59 |
并不是你想的那样。
mov eax,1
mov eax,00000001h
它们是等价的。
同理
push 1
push 00000001h
它们也是等价的,只是前面0可以省略不写。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2012-08-02 17:40 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-04-30 21:05 |
回复:[第1楼]
------------------
那为什么《汇编语言》中说位数不对的就是错误的指令?书中列举的指令不等价吗?还是作者要求我们养成良好的程序写作风格?那也不能说“错误”的吧。。。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2012-08-02 19:11 ]
[引用]
[回复]
[ top ] | |
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59 |
位数并没有不等价呀,都给你说了是0被省略没写。
位数不等价类似这种,
Mov eax,ax | | |
|
|
|
|
[第4楼]
[ 回复时间:2012-08-03 06:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-04-30 21:05 |
回复:[第3楼]
------------------
哦,不好意思。看的时候太匆忙,没认真理解。现在懂了~~ | | |
|
|
|
|
[第5楼]
[ 回复时间:2012-08-03 06:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-04-30 21:05 |
回复:[第3楼]
------------------
那么,push和pop可以对不同位的寄存器操作吗?就是“pop eax”、“push eax”?是不是等价的? | | |
|
|
|
|
[第6楼]
[ 回复时间:2012-10-23 12:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-10-16 16:56 |
对2个寄存器操作才需要位数一致吧,01H 是立即数,不是寄存器 | | |
|
|
|
|
[第7楼]
[ 回复时间:2012-10-23 12:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-10-16 16:56 |
push 和 pop 是2个指令,一次取几位相互不影响,可以存16位,取8位,也可以存8位取16位,只是每次堆栈指针大小不同吧 | | |
|
|
|
|
[第8楼]
[ 回复时间:2012-12-22 16:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-12-19 13:28 |
32位可以存32位,16位,8位的;16位能存16位,8位的;8位只能存8位的。好似一列车,有总共只有8个位置,能做16个人吗?而位置有16个的话,当然可以做8个人,另为8个位置空着 | | |