Linux下的汇编语言之语法格式介绍

运维 系统运维
汇编语言是基本的语言之一,他的明显优势是速度快,可以直接对硬件进行操作。Linux下如何使用汇编语言,语法格式有哪些?需要使用哪些开发工具?本文将会为大家详细道来。

       作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。就拿 Linux 内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 Linux 的启动部分。由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而汇编语言则能够很好扬长避短,***限度地发挥硬件的性能。

***课时:Linux 汇编语法格式:

  绝大多数 Linux 程序员以前只接触过DOS/Windows 下的汇编语言,这些汇编代码都是 Intel 风格的。但在 Unix 和 Linux 系统中,更多采用的还是 AT&T 格式,两者在语法格式上有着很大的不同:

  在 AT&T 汇编格式中,寄存器名要加上 '%' 作为前缀;而在 Intel 汇编格式中,寄存器名不需要加前缀。例如:

  AT&T 格式pushl %ex

   Intel 格式push eax

  在 AT&T 汇编格式中,用 '$' 前缀表示一个立即操作数;而在 Intel 汇编格式中,立即数的表示不用带任何前缀。例如:

  AT&T 格式 pushl $1

  Intel 格式push 1

  AT&T 和 Intel 格式中的源操作数和目标操作数的位置正好相反。在 Intel 汇编格式中,目标操作数在源操作数的左边;而在 AT&T 汇编格式中,目标操作数在源操作数的右边。例如:

  AT&T 格式addl $1, %eax

   Intel 格式add eax, 1

  在 AT&T 汇编格式中,操作数的字长由操作符的***一个字母决定,后缀'b'、'w'、'l'分别表示操作数为字节(byte,8 比特)、字(word,16 比特)和长字(long,32比特);而在 Intel 汇编格式中,操作数的字长是用 "byte ptr" 和 "word ptr" 等前缀来表示的。例如:

  AT&T 格式movb val, %al

   Intel 格式mov al, byte ptr val

  在 AT&T 汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上'*'作为前缀,而在 Intel 格式中则不需要。

  远程转移指令和远程子调用指令的操作码,在 AT&T 汇编格式中为 "ljump" 和 "lcall",而在 Intel 汇编格式中则为 "jmp far" 和 "call far",即:

  AT&T 格式 ljump $section, $offset   lcall $section, $offset

  Intel 格式jmp far section:offset   call far section:offset

  与之相应的远程返回指令则为:

  AT&T 格式 lret $stack_adjustret

  Intel 格式far stack_adjust

  在 AT&T 汇编格式中,内存操作数的寻址方式是:section:disp(base, index, scale)

  而在 Intel 汇编格式中,内存操作数的寻址方式为:section:[base + index*scale + disp]

  由于 Linux 工作在保护模式下,用的是 32 位线性地址,所以在计算地址时不用考虑段基址和偏移量,而是采用如下的地址计算方法:

  disp + base + index * scale

  下面是一些内存操作数的例子:

  AT&T 格式movl -4(%ebp), %eax  movl array(, %eax, 4), %eax  movw array(%ebx, %eax, 4), %cx  movb $4, %fs:(%eax)

    Intel 格式mov eax, [ebp - 4]     mov eax, [eax*4 + array]     mov cx, [ebx + 4*eax + array]      mov fs:eax, 4

【编辑推荐】

  1. 2.3 用汇编语言编写程序
  2. 术语汇编 基本CSS滤镜概述
  3. 琢石成器—Windows环境下32位汇编语言程序设计
  4. 3.1.3 as86汇编语言程序的编译和链接
  5. 3.1.2 as86汇编语言程序
  6. 3.1.1 as86汇编语言语法
  7. 3.2.6 as汇编命令


 

责任编辑:zhaolei 来源: 网络
相关推荐

2011-01-14 14:08:17

Linux汇编语言

2011-01-14 14:39:32

Linux汇编语言

2011-01-14 14:15:11

Linux汇编语言

2011-01-14 14:22:50

Linux汇编语言

2021-03-25 13:05:56

网络安全寄存器汇编语言

2012-02-09 09:00:54

汇编语言

2011-01-04 17:08:10

汇编语言

2021-06-11 10:02:39

语言编程开发

2010-11-09 09:51:52

汇编语言

2018-01-11 14:58:40

2022-10-31 14:02:24

汇编语言神经网络

2022-03-28 13:34:26

Go泛型部署泛型

2023-11-23 08:25:40

开发人员SmaliAndroid

2011-07-21 09:59:26

JavaScript

2017-01-12 22:36:30

2023-06-01 16:27:34

汇编语言函数

2010-01-11 11:09:10

C++语法

2012-08-13 14:13:46

2012-02-13 10:03:31

编程开发

2021-04-27 07:59:11

内联汇编 C 语言 asm 关键字
点赞
收藏

51CTO技术栈公众号