转载时格式有问题,大家看原版吧!

作者: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指令的更多相关文章

  1. 汇编语言---call和ret指令

    汇编语言--call和ret指令 call和ret指令 call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP. 它们经常被共同用来实现子程序的设计. ret和retf ret指令用栈 ...

  2. 汇编语言-[BX]和loop指令

    汇编语言-[BX]和loop指令 [BX]指令介绍 mov ax,[bx] 功能: bx为偏移地址,段地址默认为ds.因此,上面指令作用就是将ax中的数据送入内存ds:bx处,即:((ds)*16 + ...

  3. [汇编语言]-第八章 div指令,伪指令dd,dup

    1- div除法指令 (1) 除数: 有8位和16位两种,在一个寄存器或内存单元中. (2) 被除数: 默认放在AX和DX或AX中 除数为8位, 被除数为16位, 默认在AX中存放. 除数为16位, ...

  4. 汇编语言debug命令与指令机器码

    一.debug命令 二.标志信息 -r用这个指令,得到的信息右下角: NV UP EI PL NZ NA PO NC 这些符号代表的就是标志寄存器里常用标志位的值.这个是符号值对应表: 溢出标志OF( ...

  5. CSAPP阅读笔记-汇编语言初探(控制类指令)-来自第三章3.6的笔记-P135-P163

    1.正溢出与负溢出: 首先,一个正数与一个负数相加,不可能溢出,因为结果的绝对值一定小于两个加数的绝对值,既然两个加数能合理表示出来,结果一定也能合理表示出来. 其次,正溢出是由于两个很大的正数相加, ...

  6. 汇编:汇编语言实现冒泡排序(loop指令实现)

    ;=============================== ;循环程序设计 ;loop指令实现 ;冒泡排序 ;for(int i=0;i<N;i++){ ; for(int h=0;j&l ...

  7. 汇编语言LAHF和SAHF指令

    LAHF(加载状态标志位到 AH)指令将 EFLAGS 寄存器的低字节复制到 AH.被复制的标志位包括:符号标志位.零标志位.辅助进位标志位.奇偶标志位和进位标志位.使用这条指令,可以方便地把标志位副 ...

  8. 汇编语言-[bx]和loop指令和多个段

    5.1 [BX]和内存单元的描述 要完成描述一个内存单元,需要两种信息: 内存单元的地址: 可以用 [0] 表示一个内存单元, 0 表示单元的偏移地址,段地址默认在 ds 中: 同样也可以用 [bx] ...

  9. 详解汇编语言B和LDR指令与相对跳转和绝对跳转的关系

    @ 目录 为什么要有相对跳转和绝对跳转? 在程序中只有相对跳转/绝对跳转是否可以? B(BL)和LDR指令具体怎么执行的? B(BL)和LDR跳转范围是如何规定的? 为什么要有相对跳转和绝对跳转? 顺 ...

随机推荐

  1. tomcat+redis接上篇

    数据库允许远程连接 把数据库中的mysql数据库中的user表里的host项为localhost的改为 % update user set host = '%' where user = 'root' ...

  2. Big Data(二)分布式文件系统那么多,为什么hadoop还需要一个hdfs文件系统?

    提纲 - 存储模型- 架构设计- 角色功能- 元数据持久化- 安全模式- 副本放置策略- 读写流程- 安全策略 存储模型 - 文件线性按字节切割成块(block),具有offset,id - 文件与文 ...

  3. 十二、S3C2440 裸机 — SDRAM

    12.1 SDRAM 介绍 12.1.1 SDRAM 定义 SDRAM(Synchronous Dynamic Random Access Memory):同步动态随机存储器-内存条 同步是指内存工作 ...

  4. /etc/fstab 下的配置参数

    第一列:分区的label或者UUID 若要查看/dev/sdb1设备的label或者UUID[root@localhost ~]# dumpe2fs -h /dev/sdb1dumpe2fs 1.42 ...

  5. 软件安装:树上分组DP/tarjan缩点/(也许基环树?)

    提炼:tarjan环缩成点,建0虚根,跑树形DP,最难的是看出可能有n个点n条边然后缩点,n个点n条边可能不只有一个环 n个点n条边->基环树: 基环树,也是环套树,简单地讲就是树上在加一条边. ...

  6. c++string int转化简单写法

    #include<iostream> #include<string> #include<sstream> //定义了stringstream类 using nam ...

  7. 14.django返回展示一张图片

    urlpatterns = [ path('admin/', admin.site.urls), # 使用django返回一张土图片的时候需要间接的访问一个中间接口,是html页面的中的img的src ...

  8. UVA 11988 Broken Keyboard (a.k.a. Beiju Text)(链表)

    题目代号:UVA 11988 题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&pa ...

  9. Java的格式化输出

    在java中除了有System.out.println();和System.out.print();之外还有一种格式化的输出,用来限制宽度,保留小数点后的位数,还有对齐方式. 代码: package ...

  10. sqli-labs(32)

    0x1查看源代码 (1)代码关键点 很明显,代码中利用正则匹配将 [ /,'," ]这些三个符号都过滤掉了 preg_replace 0x2 宽字符注入 (1)前言 在mysql中,用于转义 ...