首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >澄清关于汇编是什么的基本概念的问题

澄清关于汇编是什么的基本概念的问题
EN

Stack Overflow用户
提问于 2012-05-06 15:05:37
回答 4查看 475关注 0票数 3

我很难找到一个开始学习汇编的好地方。我在互联网上发现了许多相互矛盾的信息,比如汇编到底是什么,使用哪些汇编程序,汇编程序是什么,以及英特尔是否为其特定的CPU家族发布了一种“核心”汇编语言(我有一台英特尔x86 CPU,这就是我想学习汇编的目的)。

有没有人能解释一下上面提到的麻烦。据我所知,英特尔发布了带有指令集/参考的中央处理器系列(例如x86),各种汇编程序(MASM、FASM、NASM等)提供了一种更高级别的人类可读语言,用于生成机器代码指令。

另外,据我所知,当有人说“汇编语言”时,这实际上是指由许多不同的汇编器提供的许多不同风格的汇编语言中的一种。http://en.wikipedia.org/wiki/X86_assembly_language#Examples MASM样式程序集与NASM样式程序集

我正在寻找的是“第一个”汇编器,没有MASM,NASM等提供的变体(如大型宏库)。所有这些汇编器肯定都来自某个地方,这就是我要找的。

基本上,我正在寻找第一个x86汇编器/汇编语言,在MASM,NASM等之前。谁能为我提供到这个第一个汇编器的链接?

顺便说一句,如果我关于汇编的整个逻辑是错误的,有人能澄清一下吗?

提前谢谢你,

程序

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-06 16:09:18

老实说,直接与CPU对话的真正语言是machine code。这意味着要弄清楚某些指令必须使用的实际字节值。这显然太单调乏味且容易出错,所以人们使用汇编程序来代替。汇编程序将机器代码的文本表示翻译成机器代码本身,并处理各种繁琐的细节,如计算相对地址等。

对于特定的机器代码,可以有许多不同的汇编器,每个汇编器都有自己关于如何编写汇编的想法。对于x86处理器来说尤其如此--大致上,有两种风格:英特尔和AT&T。在这两种处理器中,不同的汇编器可以有不同的宏和指令集等等。

为了说明这一点,下面是一个使用gcc -S -masm=intel从一些C代码生成的程序集示例

代码语言:javascript
运行
复制
    cmp     eax, ebx
    jl      .L63
    mov     eax, DWORD PTR inbuffd
    mov     DWORD PTR [esp+8], 8192
    mov     DWORD PTR [esp+4], OFFSET FLAT:inbuf
    mov     DWORD PTR [esp], eax
    call    read
    cmp     eax, -1
    mov     ebx, eax
    mov     DWORD PTR inbytes, eax
    je      .L64
    test    eax, eax
    je      .L36
    mov     eax, 1
    xor     edx, edx
    jmp     .L33

下面是用gcc -S -masm=att生成的相同代码片段

代码语言:javascript
运行
复制
    cmpl    %ebx, %eax
    jl      .L63
    movl    inbuffd, %eax
    movl    $8192, 8(%esp)
    movl    $inbuf, 4(%esp)
    movl    %eax, (%esp)
    call    read
    cmpl    $-1, %eax
    movl    %eax, %ebx
    movl    %eax, inbytes
    je      .L64
    testl   %eax, %eax
    je      .L36
    movl    $1, %eax
    xorl    %edx, %edx
    jmp     .L33

这两个代码片段生成相同的机器码-区别只是汇编语法不同。特别要注意参数顺序的不同之处(英特尔是目标优先,AT&T是源优先)、指令名的细微差别、在AT&T中使用%指定寄存器等。

然后是不同的CPU。CPU具有一定的体系结构。这意味着它将执行该体系结构的指令集。对于该体系结构,将有一个核心指令集,并可能为增强功能或特殊应用程序提供额外的指令组。x86是一个很好的例子--你有浮点指令,MMx,3DNow!该体系结构的不同CPU可能能够也可能不能理解额外的指令;通常有一些方法可以询问CPU它支持什么。

当你说“CPU汇编”时,人们理解你的意思是,“可以在x86架构的任何x86上运行的汇编”。

更复杂的CPUs尤其是那些具有内存管理功能(包括x86)的CPU,其功能不仅仅是执行指令。从80286开始,x86体系结构有两种主要模式--实模式和保护模式。核心指令集可以在任何一种模式下按原样使用,但内存在每种模式下的工作方式完全不同,因此尝试编写在这两种模式下都能工作的实际代码是不切实际的。

后来的CPU引入了更多的模式。386引入了CPU又名v86模式,允许保护模式操作系统运行实模式程序,而不必实际将Virtual 8086 mode切换到实模式。AMD64处理器在long mode中运行64位代码。

一个处理器可以支持多个体系结构- Itanium architecture被认为是一个独立的体系结构,所有由英特尔发布的支持安腾的CPU也支持x86,并能够在它们之间进行切换。

x86家族可能是汇编语言的一个过于复杂的例子--它有一个terribly long and complex history going back 33+ years。用于(32位)应用程序的核心指令的机器码与1978年发布的8086相同。它已经经过了几次修订,each adding more instructions

如果您想要正确地学习x86汇编,请考虑:

  • The Art of Assembly Language Programming,,并且有一个分别适用于DOS、Windows和Linux的版本。Windows和Linux版本使用的是作者发明的高级汇编或HLA语言,它有点像x86汇编,但并不是真的。这可能是你喜欢的,也可能不是你喜欢的--它不是严格意义上的真正的汇编,但概念都在那里,之后学习编写正确的汇编不会有太大的努力。值得肯定的是,它还包含了大量与汇编相关的资料,如处理器体系结构、基本输入输出系统、视频等的信息。DOS版本教导直接MASM (英特尔) assembly.
  • Programming from the Ground Up教导AT&T风格的汇编在Linux

对于实际的汇编程序(免费的),可以在windows上试试MASM32 (英特尔风格),或者在Linux上试试as。碰巧的是,Linux as将汇编英特尔或AT&T风格的汇编程序。

如果您对x86体系结构感到畏惧,并且愿意学习其他体系结构的汇编,请考虑从something smaller开始。

票数 7
EN

Stack Overflow用户

发布于 2020-03-28 01:13:41

除了Michael Slade的精彩回答之外,这里还有一些历史信息:

第一个x86汇编程序被称为“ASM86”。它是由英特尔生产的,最初在他们的8位"ISIS“操作系统上运行。在DOS下运行的较新版本已由在线软件历史博物馆WinWorld保存。你可以在here上找到它。随附的手册归档文件包括英特尔1985年的ASM86方言参考手册。它支持常见的指令,如ASSUME、SEGMENT、DB/DW、END等,以及更高级的宏。

我在网上找到的最早的x86汇编语言参考资料是1979年的英特尔MCS-86宏汇编语言手册。BitSavers here保留了一份PDF副本。

最初的ASM86的设计者之一埃里克·艾萨克森继续写了A86,一种精神上的继承者。A86的方言与ASM86非常相似,但有很多关于假设和片段指令的繁琐之处,比如(Eric Isaacson将它们称为“繁文规定”)轻松或消除了它们。在提供OP似乎正在寻找的裸机汇编语言的精神方面,A86可能比ASM86更好。A86只有16位;为了运行它,你需要一个DOS模拟器,或者一台运行旧版本Windows的机器(我有一台旧的IBM Thinkpad x23,它仍然运行Windows XP;我一直在它的DOS机器上运行A86,没有任何问题)。

最后,在OS/2 Museum上有一篇关于使用ASM86在ISIS-2平台上构建原始ISIS的精彩博客文章。

票数 3
EN

Stack Overflow用户

发布于 2012-05-06 16:11:38

我不认为有核心汇编程序这样的东西。他们每个人都有自己的方言。此外,在选择之前,您可能需要考虑要为哪种操作系统编写代码。

这似乎是一篇很好的文章,可以帮助你从以下几个方面入手:http://webster.cs.ucr.edu/AsmTools/WhichAsm.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10468831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档