我已经读过汇编语言与处理器有关,并且每个处理器都有一组特殊的指令。 我使用的是intel i5 x86_64架构处理器。 当我编写代码时,我没有使用任何不同的指令集。 我使用NASM汇编程序。它汇编我的代码并转换为二进制。 那么处理器的问题是什么。 即使我的不同架构的朋友运行相同的代码(没有编译但源代码)并获得相同的输出... 那么汇编语言处理器依赖于哪里?
代码是......它只是一个例子,每一段代码都运行在x86_64和8088微处理器架构上
[ORG 0x7c00]
xor ax, ax ;make it zero
mov ds, ax
mov si, msg
call bios_print
hang:
jmp hang
msg db 'Welcome to Macintosh', 13, 10, 0
bios_print:
lodsb
or al, al ;zero=end of str
jz done ;get out
mov ah, 0x0E
int 0x10
jmp bios_print
done:
ret
times 510-($-$$) db 0
db 0x55
db 0xAA
答案 0 :(得分:2)
前往汽车经销商并乘坐全新的丰田试驾。然后去其他二手车批次,找到相同型号的旧的丰田,但不同年份。它们每年都不相同,但它们通常与其他型号一样多年,一次放置,外观和感觉,如果有些物品,门锁,窗户控制等等。然后去一个福特经销商并重复一些模型福特即使它们既是带有四个轮子的汽车又是一个完成相同工作的发动机,它也会立即与丰田汽车大不相同。在福特人中,他们通常与他们的兄弟姐妹以及之前和之后的年度模型相似,具体细节,连续多年共享零件。
这里没有什么不同,x86处理器中有一些项目,你可以看到一直到第一个8088/86的相似之处。但是将它与power pc或arm或mips进行比较,你会发现尽管它们都是可以运行现代操作系统的处理器,但它们各自的细节和外观在品牌上的差异要大于品牌内部。
答案 1 :(得分:0)
处理器依赖性存在不同层次。英特尔为使后续CPU与其系列的先前CPU兼容而付出了很多努力,因此完全可以编写在多个“不同”CPU上运行的代码。
但是,当您尝试编写一些利用特定功能的汇编代码时,这已不再适用。如果你尝试编写高性能代码,那么规则也会在不同的CPU上发生变化,甚至来自同一个系列。
如果您查看英特尔的指令集并将它们与旧版本相媲美,您将很容易看到较新的CPU还具有以前无法使用的新指令。
此外,操作系统还通过为旧程序提供支持来发挥作用。例如,您可以在Windows XP之前本机运行16位应用程序。在Windows 7 64位中,支持被删除。因此,在运行此类代码时,您可能甚至没有注意到有一层支持使您的prorgam仍在工作。
答案 2 :(得分:0)
尽管8088和英特尔酷睿i5是两种不同的野兽,它们之间存在巨大差异,但有一件事使它们“连接”:Core i5与8088二进制兼容。事实上,所有的x86处理器与旧的8088二进制兼容,至少在所谓的“实模式”中使用它们。二进制兼容性意味着为8088编写的程序将在Core i5处理器中运行,前提是两个处理器都安装在具有相同或兼容I / O设备的系统中(除非您的程序不需要与现实世界通信)
此外,还有来自不同制造商的处理器兼容源。这意味着为一个处理器编写的汇编程序源代码可以使用直接转换为另一个处理器的二进制代码进行汇编。例如:Z80处理器的源代码可以组装成输出8088处理器的二进制代码(因此,对于Core i5处理器!)
并且有来自完全不同系列的处理器,它们之间完全不兼容,例如,PowerPC架构与Intel x86架构。对于他们来说,为了允许为其中一个编写的程序能够在另一个程序中运行,必须存在某种翻译器,解释器或JIT编译器。运行在英特尔处理器上的OS X就是这种情况,它使用一个名为Rosseta的软件来读取和转换PowerPC架构到x86架构的即时指令。