操作系统汇编语言之AT&T指令
转载时格式有问题,大家看原版吧!
作者:EwenWanW
来源:CSDN
原文:https://blog.csdn.net/xiaoxiaowenqiang/article/details/80530438
版权声明:本文为博主原创文章,转载请附上博文链接!
---------------------
计算机系统结构cpu内部:
1. PC Program Counter
指令指针寄存器
指向下一条指令的地址
EIP(X86-32)或者
RIP(X86-64)
2. 寄存器与寄存器堆
Registers
在处理器CPU内部以名字来访问的快速存储单元
3. 条件状态码
Condition Codes
用于存储最近执行指令的结果状态信息
用于条件指令的判断执行
内存单元Memory:
以字节编码的连续存储空间
存储程序代码、数据、运行栈stack 以及操作系统数据汇编语言数据格式c 语言
汇编代码:
addl 8(%ebp) %eax//l表示双字 8是位偏移量
操作数:
x: 寄存器 Register eax
y: 内存 Memory M[ebp+8] ebp是函数栈基址寄存器
t: 寄存器 Register eax
结果t保存在寄存器eax中
类似于表达:
x += y
或者:
int eax;
int* ebp;
eax += ebp[2];//这里按字节数据传送指令movel 源地 目的地
将一个双字从源地移动到目的地
允许的操作数类型有:
立即数Imm:常整数
如: $0x400, $-533
可以用1,2或4个字节来表示
寄存器 Reg:
8个通用寄存器之一
%eax
%ebx
%ecx
%edx
%esi
%edi
%esp 栈顶
%ebp 栈底
存储器Mem:四个连续的字节
汇编 类似C语言
立即数--->寄存器 movl $0x41, %eax temp = 0x41;
立即数--->内存 movl $-43, (%eax) *p = -43;
寄存器--->寄存器 movl %eax, %edx temp2 = temp;
寄存器--->内存 movl %eax, (%edx) *p = temp;
内存 --->寄存器 movl (%eax), %edx temp = *p;
不允许内存到内存 简单得寻址模式1. 间接寻址 (R) Mem[Reg[R]]
寄存器R 指定得内存地址
movl (%ecx), %eax
2. 基址+偏移量 寻址 D(R) Mem[Reg[R] + D]
寄存器R 指定内存的起始地址
常数D 给出偏移地址
movl 8(%ebp), %ecx寻址模式使用示例交换两个数
C语言
void swap(int* xp, int* yp){
int t0 = *xp;
int t1 = *yp;
*xp = t1;
*yp = t0;
}
汇编语言分析
寄存器 变量:
%ecx yp
%edx xp
%eax t1
%ebx t0
对应汇编:
movl 12(%ebp),%ecx # ecx = yp 是地址 放到ecx寄存器中
movl 8(%ebp), %edx # edx = xp 是地址 放到edx寄存器中
movl (%ecx), %eax # eax = *yp t1 值 取寄存器中地址指向的内存地址中的内容放入 寄存器eax中
movl (%edx), %ebx # ebx = *xp t0 值 取寄存器中地址指向的内存地址中的内容放入 寄存器ebx中
movl %eax, (%edx) # *xp = eax 交换内容放入原来内存指向得地址中
movl %ebx, (%ecx) # *yp = ebx
ebp 是函数栈 基地址
ebp+8 的位置 存储 指针xp 指向内存的一个地址
ebp+12 的位置 存储 指针yp 指向内存的一个地址变址寻址常见形式:
D(Rb,Ri,S) Mem[Reg[Rb] + S*Reg[Ri] + D]
D: 常量(地址偏移量)
Rb: 基址寄存器:8个通用寄存器之一
Ri: 索引寄存器: %esp不作为索引寄存器
一般%ebp也不做这个用途
S: 比例因子, 1,2,4,8
其他变形:
D(Rb,Ri) Mem[Reg[Rb] + Reg[Ri] + D]
(Rb,Ri) Mem[ Reg[Rb] + Reg[Ri] ]
(Rb,Ri) Mem[Reg[Rb] + S*Reg[Ri]]地址计算指令 leal , lea +lleal src, dest
src 是地址计算表达式子 D(Rb,Ri,S) ---> Reg[Rb] + S*Reg[Ri] + D
计算出来得地址赋给 dest
使用实例:
地址计算,无需访问内存 auto *p = &x[i];
进行x+k*y这一类型得整数计算,k = 1,2,4,8整数计算指令:addl src,dest # dest = dest + src #加法
subl src,dest # dest = dest - src #减法
imull src,dest # dest = dest * src #乘法
sall src,dest # dest = dest << src #左移位 等价于shll
sarl src,dest # dest = dest >> src #算术右移位 补 被移动数的最高位
shrl src,dest # dest = dest >> src #逻辑右移位 左边单纯补 0
xorl src,dest # dest = dest ^ src #按位异或
andl src,dest # dest = dest & src #按位与
orl src,dest # dest = dest | src #按位或
incl dest # dest = dest + 1 #++ 自增1
decl dest # dest = dest - 1 #-- 自减1
negl dest # dest = - dest # 取非
notl dest # dest = ~ dest # 取反
操作系统汇编语言之AT&T指令的更多相关文章
- 汇编语言---call和ret指令
汇编语言--call和ret指令 call和ret指令 call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP. 它们经常被共同用来实现子程序的设计. ret和retf ret指令用栈 ...
- 汇编语言-[BX]和loop指令
汇编语言-[BX]和loop指令 [BX]指令介绍 mov ax,[bx] 功能: bx为偏移地址,段地址默认为ds.因此,上面指令作用就是将ax中的数据送入内存ds:bx处,即:((ds)*16 + ...
- [汇编语言]-第八章 div指令,伪指令dd,dup
1- div除法指令 (1) 除数: 有8位和16位两种,在一个寄存器或内存单元中. (2) 被除数: 默认放在AX和DX或AX中 除数为8位, 被除数为16位, 默认在AX中存放. 除数为16位, ...
- 汇编语言debug命令与指令机器码
一.debug命令 二.标志信息 -r用这个指令,得到的信息右下角: NV UP EI PL NZ NA PO NC 这些符号代表的就是标志寄存器里常用标志位的值.这个是符号值对应表: 溢出标志OF( ...
- CSAPP阅读笔记-汇编语言初探(控制类指令)-来自第三章3.6的笔记-P135-P163
1.正溢出与负溢出: 首先,一个正数与一个负数相加,不可能溢出,因为结果的绝对值一定小于两个加数的绝对值,既然两个加数能合理表示出来,结果一定也能合理表示出来. 其次,正溢出是由于两个很大的正数相加, ...
- 汇编:汇编语言实现冒泡排序(loop指令实现)
;=============================== ;循环程序设计 ;loop指令实现 ;冒泡排序 ;for(int i=0;i<N;i++){ ; for(int h=0;j&l ...
- 汇编语言LAHF和SAHF指令
LAHF(加载状态标志位到 AH)指令将 EFLAGS 寄存器的低字节复制到 AH.被复制的标志位包括:符号标志位.零标志位.辅助进位标志位.奇偶标志位和进位标志位.使用这条指令,可以方便地把标志位副 ...
- 汇编语言-[bx]和loop指令和多个段
5.1 [BX]和内存单元的描述 要完成描述一个内存单元,需要两种信息: 内存单元的地址: 可以用 [0] 表示一个内存单元, 0 表示单元的偏移地址,段地址默认在 ds 中: 同样也可以用 [bx] ...
- 详解汇编语言B和LDR指令与相对跳转和绝对跳转的关系
@ 目录 为什么要有相对跳转和绝对跳转? 在程序中只有相对跳转/绝对跳转是否可以? B(BL)和LDR指令具体怎么执行的? B(BL)和LDR跳转范围是如何规定的? 为什么要有相对跳转和绝对跳转? 顺 ...
随机推荐
- C语言——枚举类型用法
1.枚举的定义 enum 枚举名{ 枚举元 素1,枚举元素2,枚举元素3...}: 2.使用枚举类型的好处 增加程序的可读性,我们都知道在计算机中所有信息都是用二进制来表示的,如果你用二进制来表示某件 ...
- Big Data(一)分治思想
按照课程安排,接下来半年,我将会去上一个为期半年的大数据课程.第一课是马士兵老师机构的周老师所讲,这里单纯记录讲课的内容. 问题1: 我有一万个元素(比如数字或单词)需要存储? 如果查找某一个元素,最 ...
- java面试02——基础
1. JDK . JRE 和JVM有什么区别? JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境. JRE:Java Runtim ...
- Jmeter插件介绍
JMeterPlugin可以把JMeter生成的jtl文件做出很好的统计图,同时还支持机器的cpu.memory.swap.disk io和network的监控. 插件可分四类: 用于服务器性能监视的 ...
- linux下yum安装python3
linux下yum安装python3 linux下yum安装python3yum install python34 -ypython3 --version wget --no-check-certif ...
- 【NOIP2016提高A组五校联考2】tree
题目 给一棵n 个结点的有根树,结点由1 到n 标号,根结点的标号为1.每个结点上有一个物品,第i 个结点上的物品价值为vi. 你需要从所有结点中选出若干个结点,使得对于任意一个被选中的结点,其到根的 ...
- shell练习--关于二维数组的实现问题
关于二维数组的实现问题:通过查询网友们的记录,可知有两个方法 方法1:通过通过2次读取赋值,来获取二维数组的方法. a=('1 2 3' '4 5 6' '7 8 9') for i in " ...
- vector利用swap()函数进行内存的释放
首先,vector与deque不同,其内存占用空间只会增长,不会减小.比如你首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个.所有 ...
- 杨辉三角 x
杨辉三角是美丽的数学结晶,其结论往往多蕴含自然之美. ——以下内容均摘抄自题解. 例题: 洛谷P1762 偶数 正如这题所示,数据在n<=10^15的范围内则引导我们去寻找空间更节省,速率更高 ...
- BZOJ 1901 洛谷 P2617 ZOJ 2112 Dynamic Rankings
以下时空限制来自zoj Time limit 10000 ms Memory limit 32768 kB OS Linux Source Online Contest of Christopher' ...