汇编第一问......

femalelover 2008-01-06 03:32:31
1, 是所有的计算机都有八个寄存器(%eax等), 还是都有八种,如有很多个%eax?

2, 同一行代码, 由GCC编译和与CL编译出来后, 指令可能有些不同吧?

3, 同一条指令如mov, 它只有唯一的格式呢, 还是有多种格式? 下面这个好像有两种不同格式:
mov ecx,11h
mov eax,dword ptr [ebp-4]

4, 第3问的11h, dword ptr[ebp-4]各是什么意思?

5, 回到第2问, 如果GCC, CL编译出来的指令各不相同, 硬件却要都支持, 岂不是很累? 那么多编译器, 支持得过来吗?

谢谢, 以后还会有很多类似的简单问题, 全部是20分一个, 请多支持啊.
...全文
123 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttlyfast 2008-01-06
  • 打赏
  • 举报
回复
基础知识 回去看书去
femalelover 2008-01-06
  • 打赏
  • 举报
回复
intel语法? 那at&t语法是从左向右?
EvilCross 2008-01-06
  • 打赏
  • 举报
回复
``````````
一生有爱1980 2008-01-06
  • 打赏
  • 举报
回复
学习,佩服2楼、3楼对汇编的理解~~
郑一 2008-01-06
  • 打赏
  • 举报
回复
刚学WIN32汇编 和lz一样
czlyc006 2008-01-06
  • 打赏
  • 举报
回复
mov ecx,11h
11h是一个立即数, 那这条指令不是把一个寄存器的内容赋值给一个立即数吗?
------------------------------------------------------------------
mov指令的操作数传送方向是从右向左
goodmrning 2008-01-06
  • 打赏
  • 举报
回复
学习,佩服2楼、3楼对汇编的理解~~
ltc_mouse 2008-01-06
  • 打赏
  • 举报
回复
学习,佩服2楼、3楼对汇编的理解~~
band_of_brothers 2008-01-06
  • 打赏
  • 举报
回复
反了,是把一个立即数赋值给寄存器。你这里用的是intel语法。
femalelover 2008-01-06
  • 打赏
  • 举报
回复
mov ecx,11h
11h是一个立即数, 那这条指令不是把一个寄存器的内容赋值给一个立即数吗?
band_of_brothers 2008-01-06
  • 打赏
  • 举报
回复

1. 当然不是,cpu不同,寄存器个数不同的,你只用过x86架构的cpu,没用过ibm和sun的cpu,所以才有这种疑问。
2. 是的,会有不同,编译器不同,编译出来的指令会有不同的。
3. 当然不同了,不同的操作数类型,具体指令的机器码会不同,具体参看opcode
4. 11h就是一个立即数啊,dword ptr[ebp-4] 是 ebp-4 这个地址指向的4个字节看做一个整体。
5. 硬件怎么会累呢?所谓的不同,是编译器编译出来的指令的个数不同,但所有的指令都是cpu认识的。
比如,假设一条语句 int x = 2;
gcc 假设编译出一条:
mov dword ptr [ebp],2

而cl编译出两条:
mov word ptr [ebp],2
mov word ptr [ebp+2],0

一样的啊,虽然指令个数不同,但这些指令cpu都认识啊,说指令不同,不是说在机器层面指令的机器码不同,明白了吗?


最后,看你问的问题,说明你思考的很深,值得称赞,但是苦于目前掌握的知识还比较少,很多困惑,很多疑问,比较痛苦吧?不要急,慢慢来,最后都会明白的,谁都是这样过来的。我本身就喜欢探寻根本,所以深知个中的痛苦,我的blog里有些寻根究底的文章,你可以参考下。

我的blog:http://blog.csdn.net/band_of_brothers/


欢迎交流


:-)

czlyc006 2008-01-06
  • 打赏
  • 举报
回复
1.所有的x86架构32位CPU(不要说“机器”)都有八个通用寄存器(eax,ebx等),寄存器的名称是唯一的,不是“八种”,当然专用寄存器也有很多。

2.是的,不同的编译器会根据自身的设计特性对源代码做不同处理和优化。

3.有多种操作数类型的组合(不要说“格式”),32位x86CPU的mov指令大致有六类组合方式,大多数指令后跟的操作数类型也不止一种。

4.11h是一个数值,是十六进制的11,换算成十进制就是17,[ebp-4]是对比ebp寄存器中所存地址低4位的地址进行寻址。
实际使用中,ebp经常作为高级语言的局部函数变量指针使用,即由其存放的地址加以运算从而得到某个特定局部变量的存放地址。DWORD是数据类型,
指32位(4字节)的值,PTR是操作数尺寸重载运算符。DWORD PTR的意思就是强制只读取后面内存地址所指向的数值的前
32位。

5.无论编译器把程序编译成什么样的结构,该程序所能调用的全部CPU指令是固定的。这个问题应该倒过来看,编译器是为了翻译程序源代码
成为CPU能看得懂的机器指令而存在的,编译器的翻译结果永远跳不出CPU所规定的指令集范围,所以结论应该倒过来看,不是CPU去支持编译器,而是
编译器的想办法去支持相应指令集的CPU。
femalelover 2008-01-06
  • 打赏
  • 举报
回复
KAO, 汇编区摆了半天, 没人, 移动C语言试试

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧