我正在尝试学习汇编语言,我有一些疑问,我在下面提到

问题描述 投票:0回答:4

我读过汇编语言依赖于处理器,并且每个处理器都有一组特殊的指令。 我使用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
assembly architecture processor
4个回答
2
投票

去汽车经销商处,开一辆全新的丰田试驾。 然后去其他二手车场找到同型号但不同年份的旧丰田。 它们每年都不相同,但多年来它们通常与其他车型非常相似,例如某些物品、门锁、车窗控制等的位置和外观和感觉。然后去福特经销商处,对某些车型进行重复福特的。 福特与丰田立刻就有了显着的不同,尽管它们都是四轮汽车和具有相同功能的发动机。 在福特汽车中,它们通常与它们的兄弟姐妹以及前年和后年模型的具体细节相似,连续多年共享零件。

这里没有什么不同,x86 处理器中的一些项目您可以看到与第一个 8088/86 的相似之处。 但将其与 Power PC、ARM 或 mips 进行比较,您会发现,尽管它们都是可以运行现代操作系统的处理器,但它们的具体细节以及外观和感觉在不同品牌之间比在品牌内部差异更大。


0
投票

处理器依赖性有不同的层次。 Intel 做了很多努力来使后续 CPU 与其系列中的早期 CPU 兼容,因此完全可以编写在多个“不同”CPU 上运行的代码。

但是,当您尝试编写一些利用特定功能的汇编代码时,情况就不再如此了。如果您尝试编写高性能代码,即使来自同一系列的不同 CPU 上的规则也会发生变化。

如果您查看 Intel 的指令集并将其与旧指令集进行比较,您将很容易发现较新的 CPU 也具有以前不可用的新指令。

操作系统也通过为旧程序提供支持来发挥作用。例如,您可以在 Windows XP 之前本机运行 16 位应用程序。在 Windows 7 64 位中,该支持已被取消。因此,当运行这样的代码时,您可能甚至没有注意到有一层支持使您的程序仍然可以工作。


0
投票

尽管 8088 和 Intel Core i5 是两种不同的野兽,它们之间存在巨大差异,但有一件事使它们成为“连接”:Core i5 与 8088 二进制兼容。事实上,所有 x86 处理器与旧的 8088 二进制兼容,至少在所谓的“实模式”下使用时是这样。二进制兼容性意味着为 8088 编写的程序将在 Core i5 处理器中运行,前提是两个处理器都安装在具有相同或兼容 I/O 设备的系统中(除非您的程序不需要与现实世界通信) .

此外,还有来自不同制造商的处理器是源兼容的。这意味着为一个处理器编写的汇编源代码可以通过直接翻译为另一处理器的二进制代码来进行汇编。示例是:Z80 处理器的源代码可以被汇编为输出 8088 处理器的二进制代码(因此也适用于 Core i5 处理器!)

还有来自完全不同系列的处理器,它们之间完全不兼容,例如,PowerPC 架构与 Intel x86 架构。对于他们来说,为了允许为其中之一编写的程序能够在另一个中运行,必须存在某种翻译器、解释器或 JIT 编译器。在 Intel 处理器上运行的 OS X 就是这种情况,它使用一款名为 Rosseta 的软件来读取 PowerPC 架构的即时指令并将其转换为 x86 架构。


0
投票

当您使用: [组织 0x7c00]

xor ax, ax ;使其为零 mov ds, 斧头

您正在使用 8088、8086、80386、80486、Pentium 和现代处理器识别的寄存器,但如果您使用例如: 异或 EAX, EAX ;使其为零

此代码不会针对 8088 和 8086 进行编译,但会针对 80386 及更高版本进行编译,因为 AX 是 16 位寄存器,EAX 是 32 位寄存器。

© www.soinside.com 2019 - 2024. All rights reserved.