自己动手写操作系统之汇编基础——as86汇编和GNU as汇编简介与对比

概述:在自己动手写操作系统的时候,往往在开始阶段对汇编语言感到困难。汇编语言之所以会感觉困难,往往是既是因为偏底层,而我们平时接触的多为高级语言;另一方面是由于其平台相关性:C语言是通用的,但汇编不是。这就是说,intel和MIPS上的汇编语言是不同的,因为它们底层支持的机器指令集就不同,这是汇编向下的一方面;另一方面,向上,即使在一类处理器上,汇编语言也会因为编译器的不同而有所差别,这也正是本文要讲解的内容。本文主要讲解INTEL处理器上两种汇编语法,主要宏观讲解,具体的指令将在以后的博客中讲到。

1.as86汇编语言语法

语句种类:

空行;赋值语句;伪操作符语句和及其指令语句。其中,伪操作符语句是汇编器使用的指示符,通常不会产生任何代码,它由伪操作码和任意多个操作数组成。机器指令语句是可执行机器指令的助记符,一条汇编语句通常包含标号(可选)+指令名称+操作数。汇编语言产生的目标文件,通常包含三个段或者区(section),正文段(.text),数据段(.data)和未初始化数据段(.bss)


2.as86汇编语言程序


2.1寻址方式:对比两种语法在直接寄存器寻址和立即数寻址上的异同

直接寄存器寻址:

mov bxax

jmp bx

间接寄存器寻址:

movbx】,ax

jmpbx

立即数寻址 

movax#1234

movax#msg1

绝对寻址:

movax1234

movaxmsg1

索引寻址:

movaxmsg1bx


2.2定义常见变量

字符串变量:msg1.ascii“ Loading System...”

字符: .byte13,10

双字: .word 0xAA55



2.3常见指令:

jmpigo,BOOTSEG

段间跳转指令,跳转到BOOTSEGgo这个位置,这个指令将会隐式改变CSIP



2.4常见伪操作符

.ORG,在汇编语言中是一条指令。其作用是告诉汇编程序,在开始执行的时候,将某段机器语言装载到内存中的哪个地址。如果没有它,有些指令就不能正确地翻译和执行。



GNUas汇编

1.as汇编语法,这也是linux上直接编译C以后的汇编语法

as汇编使用AT&T系统V的汇编语法,于intel汇编程序使用的语法不一样。

1)立即数寻址要用“$”;寄存器操作数之前要用“%”,绝对跳转和调用要加“*”

2)操作数顺序是从左到右“源,目的”

3)内存操作数的长度由操作码的最后一个字符来确定

4AT&T语法立即形式的远程跳转和调用是limp/lcall$section,$offset;intel对应的位jmp/callfar sectionoffset同样,AT&T语法中远程返回指令是lret$stack-adjust

5)AT&T汇编器不提供对多代码程序的支持,UNIX类操作系统要求所有代码在一个段中。


2.指令语句,操作数和寻址


2.1指令操作码的命名

大部分和intel语法相同,但是转换指令不同,对比如下

AT&T

Intel

说明

Cbtw

Cbw

%al中的字节值符号扩展到%ax

Cwtl

Cwde

%ax符号扩展到%eax

Cwtd

Cwd

%ax符号扩展到%dx%eax

Cltd

Cdq

%eax符号扩展到%edx%eax


2.2指令操作码前缀

指令操作码前缀用于修饰随后的操作码,通常用于重复字符串指令/提供区域覆盖/执行总线锁定/指定操作数和地址宽度。

操作码前缀

说明

csdsssesfsgs

区覆盖操作码前缀,内存引用形式会自动添加这种前缀

data16addr16

操作数/地址宽度前缀

Lock

总线锁存前缀

Wait

协处理器指令前缀

repreperepne

串指令操作前缀 ,使得船只领重复执行%ecx中指定的次数



2.3内存引用

待续


2.4跳转指令

JMP是无条件跳转指令,可分为直接跳转和间接跳转,条件跳转只有直接跳转一种形式。对于直接跳转;对于间接跳转,跳转的目的位置来自于某个寄存器或者内存位置。直接跳转的写法是给出跳转目标处的标号;间接跳转语句的语法必须使用“*”作为前缀字符。




你可能感兴趣的:(汇编语言,att,自己动手写操作系统,as86,GNUas)