912239196 发表于 2014-3-18 15:17:14

汇编与指令系统

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

912239196 发表于 2014-3-18 15:53:48


这个是8086的指令码,每个cpu的都不一样,汇编是如何确认指令码的?C:\Users\Administrator\Desktop\1.jsp

912239196 发表于 2014-3-18 16:19:46

酱油,顶一下
看似合理的指令,为什么错误,比如mov cs,0 | mov ax,bx+si+di+idata
因为指令码大小限制,没提供这些功能。。。

小甲鱼 发表于 2014-3-20 10:45:05

指令都有固定格式,一般先读第一个字节判断是否是前缀,然后读第2字节并查表看是否是机器码,若不是则读第3个字节查表,找到指令后继续读ModR/M、SIB等参数确定后面还有几个操作数。

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

具体可以参考http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

912239196 发表于 2014-3-21 09:00:46

小甲鱼 发表于 2014-3-20 10:45 static/image/common/back.gif
指令都有固定格式,一般先读第一个字节判断是否是前缀,然后读第2字节并查表看是否是机器码,若不是则读第3 ...

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

912239196 发表于 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的会反感,这些问题在大论坛不管放哪都会被删,就在这随便瞎扯不要见怪

小甲鱼 发表于 2014-3-21 12:19:41

912239196 发表于 2014-3-21 09:00 static/image/common/back.gif
我是做java的,但我想知道什么叫平台相关性,我看见c里有一道题,说c是平台相关性的,因为汇编也是平台相关性 ...

这个你挖深了,平台相关性一般指的是操作系统环境,JAVA具有跨平台能力是因为JAVA为每个热门操作系统推出了一套虚拟机机制(JVM),这套JVM向上接受统一的JAVA语法,向下翻译成各种不同的操作系统所能够认识的代码形式。

小甲鱼 发表于 2014-3-21 12:22:32

912239196 发表于 2014-3-21 09:55 static/image/common/back.gif
算了,没什么人看,我换个方式聊聊吧,cpu指令集主流是分2种,汇编以及对应的机器码肯定不一样,当然具体的机器码 ...

纯C的代码形式在Linux平台和在Win平台下是一样,但如果在win下编译出来的可执行文件,在Linux下是无法执行的。需要将代码拷贝到GCC下编译才能实现。这里的平台相关是指操作系统对可执行文件约定的载入方式不同的不兼容。

912239196 发表于 2014-3-21 14:46:54

小甲鱼 发表于 2014-3-21 12:22 static/image/common/back.gif
纯C的代码形式在Linux平台和在Win平台下是一样,但如果在win下编译出来的可执行文件,在Linux下是无法执行 ...

我好想感觉到自己的问题了,汇编与cpu相关,而jvm是与操作系统,那是不是说相同的cpu下使用不同的操作系统,再不调用操作系统的api下,是兼容的?
很绕口,大致就是我对不兼容现象的理解,只要不调用了操作系统提供的东西就兼容了,但上面这个回答好像说掉不掉用都不兼容,汇编对cpu的依赖为什么转变成了对操作系统的依赖?

小甲鱼 发表于 2014-3-21 14:56:03

912239196 发表于 2014-3-21 14:46 static/image/common/back.gif
我好想感觉到自己的问题了,汇编与cpu相关,而jvm是与操作系统,那是不是说相同的cpu下使用不同的操作系统, ...

对的,我们所学习的无论是8086汇编(针对DOS系统级别)还是WIN32汇编(针对WINDOWS级别)都是“语言”级别的东西,他都要翻译成机器码,而CPU读取的正是机器码,对于CPU来说,所有的语言所翻译的机器码没什么两样(包括JVM),而操作系统帮你“审核”后将这些机器码提交给CPU去执行。

912239196 发表于 2014-3-21 17:20:06

小甲鱼 发表于 2014-3-21 14:56 static/image/common/back.gif
对的,我们所学习的无论是8086汇编(针对DOS系统级别)还是WIN32汇编(针对WINDOWS级别)都是“语言”级别 ...

3q,我这就去看看操作系统是怎么弄的
页: [1]
查看完整版本: 汇编与指令系统