zoukankan      html  css  js  c++  java
  • 操作系统汇编语言之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 #  取反

  • 相关阅读:
    从O(n^3) 到 O(n)求最大连续和
    冲刺博客NO.6
    冲刺博客NO.5
    冲刺博客NO.4
    冲刺博客NO.3
    冲刺博客NO.2
    冲刺博客NO.1
    结对开发:四则运算(网页版)
    课堂作业3
    软件工程概论02~ 四则运算
  • 原文地址:https://www.cnblogs.com/Comet-Fei/p/11885224.html
Copyright © 2011-2022 走看看