首页 > 技术文章 > 操作系统汇编语言之AT&T指令

Comet-Fei 2019-03-04 22:11 原文

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

作者: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 #  取反

 

 

 

 

 

 

 

 

 

 

 

推荐阅读