stol函数在linux下使用,Linux下ATT汇编语法简介一

这显得很古怪,不过在gcc知道程序员拿这些寄存器做些什么后,这确实能够对gcc的优化操作有所帮助。表5-3中是一些可能会用到的寄存器加载代码及其具体的含义。

表5-3 常用寄存器加载代码说明

代 码

说 明

代 码

说 明

a

使用寄存器eax

m

使用内存地址

b

使用寄存器ebx

o

使用内存地址并可以加偏移值

c

使用寄存器ecx

I

使用常数0~31

d

使用寄存器edx

J

使用常数0~62

S

使用esi

K

使用常数0~255

D

使用edi

L

使用常数0~65535

q

使用动态分配字节可寻址机寄存器(eax、ebx、ecx、或edx)

M

使用常数0~3

r

使用任意动态分配的寄存器

N

使用1字节常数

g

使用通用有效的地址即可(eax、ebx、ecx、edx或内存变量)

O

使用常数0~31

A

使用eax与edx联合(64位)

下面的例子不是让程序员自己指定哪个变量使用哪个寄存器,而是让gcc为程序员选择。

01 asm("leal (%1, %1, 4),

%0"02 : " =r"(y)03 : "0"(x));

第一句汇编语句leal(r1,r2,4),r3语句表示r1+r2*4→r3,。这个例子可以非常快地将x乘5。其中“%0”,“%1”是指gcc自动分配的寄存器。这里“%1”代表输入值x要放入的寄存器,“%0”表示输出值寄存器。输出寄存器代码前一定要加入等于号。如果输入寄存器的代码时0或为空时,则说明使用与相应输出一样的寄存器。所以。如果gcc将r指定为eax的话,那么上面汇编语句的含义即为:“leal(eax,eax,4),eax”。

注意:在执行代码时,如果不希望汇编语句被gcc优化而改变位置,就需要在asm符号后面添加volatile关键词:asm

volatile(……);

或者更详细地说明为:_

_asm_ _ _ _volatile_ _(……);

一、AT&T 格式Linux 汇编语法格式

1.在 AT&T

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

格式

Intel

格式

pushl �x

push eax

2.在 AT&T 汇编格式中,用 '$' 前缀表示一个立即操作数;而在 Intel

汇编格式中,立即数的表示不用带任何前缀。例如:

AT&T

格式

Intel

格式

pushl $1

push 1

AT&T 和 Intel

格式中的源操作数和目标操作数的位置正好相反。在 Intel 汇编格式中,目标操作数在源操作数的左边;而在

AT&T 汇编格式中,目标操作数在源操作数的右边。例如:

AT&T

格式

Intel

格式

addl $1, �x

add eax, 1

在 AT&T

汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀'b'、'w'、'l'分别表示操作数为字节(byte,8

比特)、字(word,16 比特)和长字(long,32比特);而在 Intel 汇编格式中,操作数的字长是用 "byte ptr"

和 "word ptr" 等前缀来表示的。例如:

AT&T

格式

Intel

格式

movb val, %al

mov al, byte ptr val

5.在 AT&T

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

远程转移指令和远程子调用指令的操作码,在

AT&T 汇编格式中为 "ljump" 和 "lcall",而在 Intel 汇编格式中则为 "jmp

far" 和 "call far",即:

AT&T

格式

Intel

格式

ljump $section, $offset

jmp far section:offset

lcall $section, $offset

call far section:offset

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

AT&T

格式

Intel

格式

lret $stack_adjust

ret far stack_adjust

在 AT&T 汇编格式中,内存操作数的寻址方式是

section:disp(base, index, scale)

而在 Intel 汇编格式中,内存操作数的寻址方式为:

section:[base + index*scale + disp]

由于 Linux 工作在保护模式下,用的是 32

位线性地址,所以在计算地址时不用考虑段基址和偏移量,而是采用如下的地址计算方法:

disp + base + index * scale

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

AT&T

格式

Intel

格式

movl -4(�p), �x

mov eax, [ebp - 4]

movl array(, �x, 4), �x

mov eax, [eax*4 + array]

movw array(�x, �x, 4), %cx

mov cx, [ebx + 4*eax + array]

movb $4, %fs:(�x)

mov fs:eax, 4

linux内核嵌入式汇编总结(1)

在linux内核中有很多的嵌入式汇编代码。

嵌入汇编的基本格式为:

asm("汇编语句":输出寄存器:输入寄存器 :会被修改的寄存器);

其中”汇编语句”是程序员写汇编指令的地方;”输出寄存器”表示当这段嵌入式汇编执行之后,哪些寄存器用于存放输出数据。这些寄存器会分别对应一个C语言表达式或一个内存地址;“输入寄存器”表示在开始执行汇编代码时,这里指定的一些寄存器中应存放的输入值,它们也分别对应着一个C变量或常数值。下面用例子来说明嵌入式汇编语句的使用方法。

我们在下面列出了一段代码作为例子来详细解说,

01 #define get_seg_byte(seg,addr)

\ 02 ({

\ 03 register char __res;

\ 04 __asm__("push %%fs;

\ 05 mov %%ax, %%fs;

\ 06 movb %%fs: %2, %%al;

\ 07 pop %%fs"

\ 08 :" =a" (__res)

\ 09 :"" (seg),"m" (* (addr)));

\ 10 __res; })

这段10行代码定义了一个嵌入式汇编语言宏函数。通常使用汇编语句最方便的方式是把它们放在一个宏内。用圆括号括住的组合语句(花括号中的语句)可以作为表达式使用,其中最后的变量__res(第10行)是该表达式的输出值。

因为是宏语句,需要在一行上定义,因此这里使用反斜杠'\'将这些语句连成一行。这条宏定义将被替换到宏名称在程序中被引用的地方。第1行定义了宏的名称,也就是宏函数名称get_seg_byte(seg,addr)。第3行定义了一个寄存器变量_

_res。第4行上的_ _asm_

_表示嵌入式语句的开始。从第4行到第7行的4条AT&T格式的汇编语句。 第8行是输出寄存器,这句的含义是在这段代码运行结束后将eax所代表的寄存器的值放入_

_res变量中,作为本函数的输出值,“=a”中的“a”称为加载代码,“=”表示这是输出寄存器。第9行表示在这段代码开始运行时将seg放到eax寄存器中,“”表示使用与上面同个位置的输出相同的寄存器。而(*(addr))表示一个内存偏移地址值。为了在上面汇编语句中使用该地址值,嵌入式汇编程序规定把输入和输出寄存器统一按顺序编号,顺序是从输出寄存器序列从左到右从上到下以“%0”开始,分别记为%0、%1、……%9。因此,输出寄存器的编号是%0(这里只有一个输出寄存器),输出寄存器前一部分(””(seg))的编号是%1,而后部分的编号是%2。上面第6行上的%2即代表(*(addr))这个内存偏移量。

现在我们来研究4~7行上的代码的作用。第一句将fs段寄存器的内容入栈;第二句将eax中的段值赋给fs段寄存器;第三句是fs:(*(addr))所指定的字节放入al寄存器中。当执行完汇编语句后,输出寄存器eax的值将被放入_

_res,作为该宏函数的返回值。

01 asm("cld\n\t"02 "rep\n\t"03 "stol"04 :

05 :

"c"(count-1), "a"(file_value),

"D"(dest)06 :

"�x", "�i");

1~3行这三句是通常的汇编语句,用以清方向位,重复保存值。第4行说明这段嵌入汇编程序没有用到输出寄存器。第5行的含义是:将count-1的值加载到ecx中,dest放到edi中。为什么要让gcc编译程序去做这样的寄存器值的加载,而不让我们自己做呢?因为gcc在它进行寄存器分配时可以进行某些优化工作。例如fill_value值可能已经在eax中。如果是在一个循环语句中的话,gcc就可能在整个循环操作中保留eax,这样就可以在每次循环中少用一个movel语句。最后一行的作用是告诉gcc这些寄存器中的值已经改变了。

通过上面分析,我们知道,宏名称中的seg代表一指定的内存段值,而addr表示一内存偏移地址量。到现在为止,我们应该很清楚这段程序的功能了吧!该宏函数的功能是从指定段和偏移值的内存地址处取一个字节。再看下一个例子。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux安装pgsql源码包解压,在Linux(centos)中使用源码安装pgRouting

目录一、解压pgRouting二、配置PostgreSQL的环境变量三、编译源代码四、测试由于pgRouting依赖于PostGIS和PostgreSQL,所以阅读本文之前,务必请先阅读:Linux(centos)中使用源码安装PostgreSQLLinux(centos)中使用源码安装PostGIS按照以上文章…

clientX和clientY属性需要注意的地方

clientX和clientY为可视区鼠标的位置。 1. 随鼠标移动的div块[runjs] 当document有多个页面时,会出现问题。[runjs] 2. 解决方案:scrollTop, scrollLeft 需要注意scrollTop/scrollLeft的兼容性获取; scrollTop document.documentElement.scr…

Android无线测试之—UiAutomator UiObject API介绍二

点击与长按 一、组件区域位置关系 Rect 对象代表一个矩形区域 [Left,Top] [Right,Bottom] 二、点击与长按API 返回值API描述booleanclick()点击对象booleanclickAndWaitForNewWindow(lang timeout)点击对象,等待新窗口出现,参数为等待超长时间booleancli…

linux系统存储文件系统,Linux文件系统的深入分析

【IT168 技术】本人很喜欢Linux,在工作中也很喜欢总结关于Linux文件系统的经验,下面就这个问题来详细说说吧。Linux支持多种文件系统,包括ext2、iso9660、jffs、ext3、vfat、ntfs、romfs和nfs等,为了对各类文件系统进行统一管理&a…

Path Sum I, II

简单题 I Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum. For example:Given the below binary tree and sum 22, 5/ \4 8/ / \11 13 4/ \ \7 2 …

【Python】进程和多进程的使用

原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、进程1.概念理解2.进程的启动3.python进程 二、多进程 前言 进程是指计算机中正在运行的程序实例。 进程可以是操作系统分配的&#…

linux 设置dns缓存周期,如何解决DNS缓存时间问题

理想情况下,各地DNS的缓存时间即为设置的ttl时间,所以可以通过设置ttl时间来控制DNS缓存的时间。ttl时间设置的短,DNS缓存过期快,在机器故障的时候很快切换,对用户的影响小;但是由于ttl设置的太短&#xff…

linux wifi pro6818,GEC6818连接Ubuntu,下载程序至开发板

windows下使用tftp工具下载文件到开发板(linux)1.下载tftp工具,也可以上CSDN找个免费0积分的 http://www.52z.com/soft/11886.html 2.确保开发板和windows在同一网段 比如192.168.101.*段 ...stm32串口烧写程序到开发板前言:我们如果要断电后重启板子还能使用…

表单-图片浏览上传-单选框(二)

一、图片浏览上传 1、依然【table】标签包含&#xff0c; 2、【input】包含了【type】等于【file】。 <table border"1" align"center"><tr><td>图片上传</td><td><input type"file"</td></tr><…

linux吉祥物的名字,知道Linux的吉祥物的名字和性别吗

知道Linux的吉祥物的名字和性别吗发布时间:2007-07-01 16:52:17来源:红联作者:PiOsnoae今天收到了这期的Linux Gazette&#xff0c;才知道原来Linux吉祥物还有一个名字叫Tux(英文直接翻译过来是男士无尾半正式晚礼服&#xff0c;倒是和这个小企鹅的打扮很配)。它是一位男式&…

android WebView总结

浏览器控件是每一个开发环境都具备的&#xff0c;这为马甲神功提供了用武之地。windows的有webbrowser&#xff0c;android和ios都有webview。仅仅是其引擎不同&#xff0c;相对于微软的webbrowser。android及ios的webview的引擎都是webkit&#xff0c;对Html5提供支持。本篇主…

c语言大数倍数,leetcode-1346(检查整数及其两倍数是否存在)--C语言实现

求&#xff1a;给你一个整数数组 arr&#xff0c;请你检查是否存在两个整数 N 和 M&#xff0c;满足 N 是 M 的两倍(即&#xff0c;N 2 * M)。更正式地&#xff0c;检查是否存在两个下标 i 和 j 满足&#xff1a;i ! j0 < i, j < arr.lengtharr[i] 2 * arr[j]示例 1&am…

LeetCode 4 Median of Two Sorted Arrays

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (mn)). 题目很简单&#xff0c;比较两数组当前指针指向的值&#xff0c;选择小的添加到新数组&…

Windows消息传递机制详解

Windows是一个消息&#xff08;Message&#xff09;驱动系统。Windows的消息提供了应用程序之间、应用程序与Windows系统之间进行通信的手段。应用程序想要实现的功能由消息来触发&#xff0c;并且靠对消息的响应和处理来完成。必须注意的是&#xff0c;消息并非是抢占性的&…

c语言求树上节点的双亲,用非递归算法求二叉树叶子结点的c语言代码怎样写?...

递归算法&#xff1a;是一种直接或者间接地调用自身的算法。在计算机编写程序中&#xff0c;递归算法对解决一大类问题是十分有效的&#xff0c;它往往使算法的描述简洁而且易于理解。递归算法的特点递归过程一般通过函数或子过程来实现。递归算法&#xff1a;在函数或子过程的…

质数之和c语言编程,C程序检查一个数字是否可以表示为两个质数之和

C程序检查一个数字是否可以表示为两个质数之和在此示例中&#xff0c;您将学习检查用户输入的整数是否可以表示为所有可能组合的两个质数之和。要理解此示例&#xff0c;您应该了解以下C语言编程主题&#xff1a;为了完成此任务&#xff0c;我们将创建一个名为checkPrime()的函…

第二次冲刺阶段 站立会议09

昨天做了什么&#xff1a;昨天把程序进行了整合 今天要做什么&#xff1a;今天我们的项目大体完成了&#xff0c;进行最后一次的测试 遇到的困难&#xff1a;整个项目整合在一起后&#xff0c;运行起来有点卡转载于:https://www.cnblogs.com/yuanyajiao/p/4575945.html

uoj #118. 【UR #8】赴京赶考 水题

#118. 【UR #8】赴京赶考 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/118 Description 高中&#xff0c;高中&#xff0c;短暂的三年。NOI是高中结业考试&#xff0c;而高考在每年暑假举行。高二暑假&#xff0c;这是你最后一次参加高考的机会。…

c语言求前15项中偶数项的和,偶数前n项和

初中数学相较于小学数学&#xff0c;在内容、难度等方面均有提高&#xff0c;因此在学生学习中&#xff0c;很多家长不知道怎样去辅导孩子学习数学&#xff0c;今天小编整理了偶数前n项和&#xff0c;仅供参考!1 等差数列的奇数项的前n项和和偶数的前n项和怎么求_百度知道1&am…

x什么意思c语言新闻app啊我et,C语言笔试题目

4、关键字const有什么含意&#xff1f;表示常量不可以修改的变量。5、关键字volatile有什么含意&#xff1f;并举出三个不同的例子&#xff1f;提示编译器对象的值可能在编译器未监测到的情况下改变。int (*s[10])(int) 表示的是什么啊int (*s[10])(int) 函数指针数组&#xff…