自己动手写操作系统之汇编基础——as86汇编和GNU as汇编简介与对比
来源:互联网 发布:淘宝开店认证二维码 编辑:程序博客网 时间:2024/05/22 12:04
概述:在自己动手写操作系统的时候,往往在开始阶段对汇编语言感到困难。汇编语言之所以会感觉困难,往往是既是因为偏底层,而我们平时接触的多为高级语言;另一方面是由于其平台相关性:C语言是通用的,但汇编不是。这就是说,intel和MIPS上的汇编语言是不同的,因为它们底层支持的机器指令集就不同,这是汇编向下的一方面;另一方面,向上,即使在一类处理器上,汇编语言也会因为编译器的不同而有所差别,这也正是本文要讲解的内容。本文主要讲解INTEL处理器上两种汇编语法,主要宏观讲解,具体的指令将在以后的博客中讲到。
1.as86汇编语言语法
语句种类:
空行;赋值语句;伪操作符语句和及其指令语句。其中,伪操作符语句是汇编器使用的指示符,通常不会产生任何代码,它由伪操作码和任意多个操作数组成。机器指令语句是可执行机器指令的助记符,一条汇编语句通常包含标号(可选)+指令名称+操作数。汇编语言产生的目标文件,通常包含三个段或者区(section),正文段(.text),数据段(.data)和未初始化数据段(.bss)。
2.as86汇编语言程序
2.1寻址方式:对比两种语法在直接寄存器寻址和立即数寻址上的异同
直接寄存器寻址:
mov bx,ax
jmp bx
间接寄存器寻址:
mov【bx】,ax
jmp【bx】
立即数寻址
movax,#1234
movax,#msg1
绝对寻址:
movax,1234
movax,msg1
索引寻址:
movax,msg1【bx】
2.2定义常见变量
字符串变量:msg1:.ascii“ Loading System...”
字符: .byte13,10
双字: .word 0xAA55
2.3常见指令:
jmpi:go,BOOTSEG
段间跳转指令,跳转到BOOTSEG:go这个位置,这个指令将会隐式改变CS和IP
2.4常见伪操作符
.ORG,在汇编语言中是一条指令。其作用是告诉汇编程序,在开始执行的时候,将某段机器语言装载到内存中的哪个地址。如果没有它,有些指令就不能正确地翻译和执行。
GNUas汇编
1.as汇编语法,这也是linux上直接编译C以后的汇编语法
as汇编使用AT&T系统V的汇编语法,于intel汇编程序使用的语法不一样。
1)立即数寻址要用“$”;寄存器操作数之前要用“%”,绝对跳转和调用要加“*”
2)操作数顺序是从左到右“源,目的”
3)内存操作数的长度由操作码的最后一个字符来确定
4)AT&T语法立即形式的远程跳转和调用是limp/lcall$section,$offset;intel对应的位jmp/callfar section:offset同样,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指令操作码前缀
指令操作码前缀用于修饰随后的操作码,通常用于重复字符串指令/提供区域覆盖/执行总线锁定/指定操作数和地址宽度。
操作码前缀
说明
cs,ds,ss,es,fs,gs
区覆盖操作码前缀,内存引用形式会自动添加这种前缀
data16,addr16
操作数/地址宽度前缀
Lock
总线锁存前缀
Wait
协处理器指令前缀
rep,repe,repne
串指令操作前缀 ,使得船只领重复执行%ecx中指定的次数
2.3内存引用
待续
2.4跳转指令
JMP是无条件跳转指令,可分为直接跳转和间接跳转,条件跳转只有直接跳转一种形式。对于直接跳转;对于间接跳转,跳转的目的位置来自于某个寄存器或者内存位置。直接跳转的写法是给出跳转目标处的标号;间接跳转语句的语法必须使用“*”作为前缀字符。
- 自己动手写操作系统之汇编基础——as86汇编和GNU as汇编简介与对比
- as86汇编示例——boot.s
- GNU as汇编简介 (AT&T语法)
- GNU as汇编简介 (AT&T语法)
- 一段汇编,引自《自己动手写操作系统》
- GNU汇编与内联汇编
- as86汇编语法
- GNU ARM 汇编简介
- ARM标准汇编与GNU汇编
- ARM标准汇编与GNU汇编
- 转帖:ARM标准汇编与GNU汇编
- ARM标准汇编与GNU汇编
- GNU ARM 汇编指令简介
- GNU ARM 汇编指令简介
- GNU ARM 汇编指令简介
- PowerPC 汇编 — PowerPC 汇编简介
- ARM汇编和Gnu汇编的转换
- ARM汇编和Gnu汇编的转换
- C++学习笔记_1:派生类与基类关系
- jquery常用效果控制
- eclipse代码自动提示设置
- 给Mac加上固件密码
- 恢复出厂设置流程概括
- 自己动手写操作系统之汇编基础——as86汇编和GNU as汇编简介与对比
- Java基础复习:编写简单的String工具类
- 单位监控系统FTP下载程序“数据库连接失败”解决办法
- jsp中的request.getParameterNames()和request.getParameterValues()详解
- JAVA序列化基础概念
- 遇到问题集锦(记录5.15--6.1)——>零起点做起
- Upload Error: 500 错误解决思路
- MAVEN打包可直接运行的jar
- 这样的骗术还真高明(修改后)