鱼C论坛

 找回密码
 立即注册
查看: 1624|回复: 10

汇编与指令系统

[复制链接]
发表于 2014-3-18 15:17:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
刚注册没几天,问个小问题
指令系统由cpu实现,不同的cpu指令不一样,那汇编该如何转换成机器码?汇编是cpu无关性的语言吗?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-18 15:53:48 | 显示全部楼层
1.jpg
这个是8086的指令码,每个cpu的都不一样,汇编是如何确认指令码的?C:\Users\Administrator\Desktop\1.jsp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-18 16:19:46 | 显示全部楼层
酱油,顶一下
看似合理的指令,为什么错误,比如mov cs,0 | mov ax,bx+si+di+idata
因为指令码大小限制,没提供这些功能。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-20 10:45:05 | 显示全部楼层
指令都有固定格式,一般先读第一个字节判断是否是前缀,然后读第2字节并查表看是否是机器码,若不是则读第3个字节查表,找到指令后继续读ModR/M、SIB等参数确定后面还有几个操作数。

如读取指令mov eax,dword ptr ss:[ebx ecx*4]先读第一个字节,查表得到前缀SS,读第2字节,发现是mov r,r/m,于是读第3字节(ModR/M)得到r=eax,r/m=disp32[--],因此需要读第4字节(SIB),得到r/m=[ebx ecx*4]

具体可以参考http://www.intel.com/content/www ... eloper-manuals.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-21 09:00:46 | 显示全部楼层

我是做java的,但我想知道什么叫平台相关性,我看见c里有一道题,说c是平台相关性的,因为汇编也是平台相关性的,就想看看汇编是如何相关的,汇编编译器的源码找不到就开始学汇编,这里教的是x86体系,,指令的格式包括兼容性方面的设计我都看过了,在这个体系(平台)下是通用的,最多分个32/64位的不同,但是在其他体系下用的就是其他体系下的汇编方式,我奇怪的是究竟是c来决定不同体系的汇编,还是大致相同的汇编来决定机器码,平台相关性指的是cpu相关,操作系统相关还是运行环境相关?c的平台相关性在pc机上会有什么限制吗?什么情况下又会出现哪些不兼容上的问题?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-21 09:55:09 | 显示全部楼层
算了,没什么人看,我换个方式聊聊吧,cpu指令集主流是分2种,汇编以及对应的机器码肯定不一样,当然具体的机器码是拓展型的,即向下兼容,c依赖于汇编,在编译的时候会选择使用体系(arm/x86),java是由jvm来进行执行(jvm是操作系统相关的)所以,java将平台的相关性转化给jvm(这个是我推出来的,不同的系统使用不同的jvm,包括java5最后一个支持win9x系统),,已达到无关性的效果...我做java2年多了,对于java平台无关性的优势没怎么研究过,就是看到c是平台相关的,感觉他相关的大致是2类cpu的指令相关,而java的相关确是java转给jvm的jvm操作系统的相关再往下推就对java平台无关性感觉好奇,c的平台相关性和java平台无关性说的是一回事吗?平台指的是什么?
其实完全就是钻牛角尖,我跟很多同事聊过,也都觉得这问题没价值,更涨不了工资,就随便看看了解下,依个汇编的名来问个问题,毕竟包含java的问题我怕做c的会反感,这些问题在大论坛不管放哪都会被删,就在这随便瞎扯不要见怪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-21 12:19:41 | 显示全部楼层
912239196 发表于 2014-3-21 09:00
我是做java的,但我想知道什么叫平台相关性,我看见c里有一道题,说c是平台相关性的,因为汇编也是平台相关性 ...

这个你挖深了,平台相关性一般指的是操作系统环境,JAVA具有跨平台能力是因为JAVA为每个热门操作系统推出了一套虚拟机机制(JVM),这套JVM向上接受统一的JAVA语法,向下翻译成各种不同的操作系统所能够认识的代码形式。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-21 12:22:32 | 显示全部楼层
912239196 发表于 2014-3-21 09:55
算了,没什么人看,我换个方式聊聊吧,cpu指令集主流是分2种,汇编以及对应的机器码肯定不一样,当然具体的机器码 ...

纯C的代码形式在Linux平台和在Win平台下是一样,但如果在win下编译出来的可执行文件,在Linux下是无法执行的。需要将代码拷贝到GCC下编译才能实现。这里的平台相关是指操作系统对可执行文件约定的载入方式不同的不兼容。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-21 14:46:54 | 显示全部楼层
小甲鱼 发表于 2014-3-21 12:22
纯C的代码形式在Linux平台和在Win平台下是一样,但如果在win下编译出来的可执行文件,在Linux下是无法执行 ...

我好想感觉到自己的问题了,汇编与cpu相关,而jvm是与操作系统,那是不是说相同的cpu下使用不同的操作系统,再不调用操作系统的api下,是兼容的?
很绕口,大致就是我对不兼容现象的理解,只要不调用了操作系统提供的东西就兼容了,但上面这个回答好像说掉不掉用都不兼容,汇编对cpu的依赖为什么转变成了对操作系统的依赖?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-21 14:56:03 | 显示全部楼层
912239196 发表于 2014-3-21 14:46
我好想感觉到自己的问题了,汇编与cpu相关,而jvm是与操作系统,那是不是说相同的cpu下使用不同的操作系统, ...

对的,我们所学习的无论是8086汇编(针对DOS系统级别)还是WIN32汇编(针对WINDOWS级别)都是“语言”级别的东西,他都要翻译成机器码,而CPU读取的正是机器码,对于CPU来说,所有的语言所翻译的机器码没什么两样(包括JVM),而操作系统帮你“审核”后将这些机器码提交给CPU去执行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-21 17:20:06 | 显示全部楼层
小甲鱼 发表于 2014-3-21 14:56
对的,我们所学习的无论是8086汇编(针对DOS系统级别)还是WIN32汇编(针对WINDOWS级别)都是“语言”级别 ...

3q,我这就去看看操作系统是怎么弄的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-30 20:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表