. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(CPU工作原理)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  这样的代码是正确的还是错误的?有关32位寄存器  [待解决] 回复[ 8次 ]   点击[ 707次 ]  
zyc969
[帖 主]   [ 发表时间: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在后来的指令集中允许了位数不相同也可以操作?
chinatree
[第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可以省略不写。
zyc969
[第2楼]   [ 回复时间:2012-08-02 17:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-04-30 21:05
回复:[第1楼]
------------------
那为什么《汇编语言》中说位数不对的就是错误的指令?书中列举的指令不等价吗?还是作者要求我们养成良好的程序写作风格?那也不能说“错误”的吧。。。
chinatree
[第3楼]   [ 回复时间:2012-08-02 19:11 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
位数并没有不等价呀,都给你说了是0被省略没写。
位数不等价类似这种,
Mov eax,ax
zyc969
[第4楼]   [ 回复时间:2012-08-03 06:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-04-30 21:05
回复:[第3楼]
------------------
哦,不好意思。看的时候太匆忙,没认真理解。现在懂了~~
zyc969
[第5楼]   [ 回复时间:2012-08-03 06:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-04-30 21:05
回复:[第3楼]
------------------
那么,push和pop可以对不同位的寄存器操作吗?就是“pop eax”、“push eax”?是不是等价的?
xuer2016
[第6楼]   [ 回复时间:2012-10-23 12:55 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-10-16 16:56
对2个寄存器操作才需要位数一致吧,01H 是立即数,不是寄存器
xuer2016
[第7楼]   [ 回复时间:2012-10-23 12:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-10-16 16:56
push 和 pop 是2个指令,一次取几位相互不影响,可以存16位,取8位,也可以存8位取16位,只是每次堆栈指针大小不同吧
wqh963577494
[第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个位置空着
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved