我很难找到一个开始学习汇编的好地方。我在互联网上发现了许多相互矛盾的信息,比如汇编到底是什么,使用哪些汇编程序,汇编程序是什么,以及英特尔是否为其特定的CPU家族发布了一种“核心”汇编语言(我有一台英特尔x86 CPU,这就是我想学习汇编的目的)。
有没有人能解释一下上面提到的麻烦。据我所知,英特尔发布了带有指令集/参考的中央处理器系列(例如x86),各种汇编程序(MASM、FASM、NASM等)提供了一种更高级别的人类可读语言,用于生成机器代码指令。
另外,据我所知,当有人说“汇编语言”时,这实际上是指由许多不同的汇编器提供的许多不同风格的汇编语言中的一种。http://en.wikipedia.org/wiki/X86_assembly_language#Examples MASM样式程序集与NASM样式程序集
我正在寻找的是“第一个”汇编器,没有MASM,NASM等提供的变体(如大型宏库)。所有这些汇编器肯定都来自某个地方,这就是我要找的。
基本上,我正在寻找第一个x86汇编器/汇编语言,在MASM,NASM等之前。谁能为我提供到这个第一个汇编器的链接?
顺便说一句,如果我关于汇编的整个逻辑是错误的,有人能澄清一下吗?
提前谢谢你,
程序
发布于 2012-05-06 16:09:18
老实说,直接与CPU对话的真正语言是machine code。这意味着要弄清楚某些指令必须使用的实际字节值。这显然太单调乏味且容易出错,所以人们使用汇编程序来代替。汇编程序将机器代码的文本表示翻译成机器代码本身,并处理各种繁琐的细节,如计算相对地址等。
对于特定的机器代码,可以有许多不同的汇编器,每个汇编器都有自己关于如何编写汇编的想法。对于x86处理器来说尤其如此--大致上,有两种风格:英特尔和AT&T。在这两种处理器中,不同的汇编器可以有不同的宏和指令集等等。
为了说明这一点,下面是一个使用gcc -S -masm=intel从一些C代码生成的程序集示例
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生成的相同代码片段
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汇编,请考虑:
中
对于实际的汇编程序(免费的),可以在windows上试试MASM32 (英特尔风格),或者在Linux上试试as。碰巧的是,Linux as将汇编英特尔或AT&T风格的汇编程序。
如果您对x86体系结构感到畏惧,并且愿意学习其他体系结构的汇编,请考虑从something smaller开始。
发布于 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的精彩博客文章。
发布于 2012-05-06 16:11:38
我不认为有核心汇编程序这样的东西。他们每个人都有自己的方言。此外,在选择之前,您可能需要考虑要为哪种操作系统编写代码。
这似乎是一篇很好的文章,可以帮助你从以下几个方面入手:http://webster.cs.ucr.edu/AsmTools/WhichAsm.html
https://stackoverflow.com/questions/10468831
复制相似问题