首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

GNU汇编总结 04

GNU汇编总结 04

3, 传送数据
   
    move 指令:
   
    格式 movex 源操作数, 目的操作数。 其中x为要传送数据的长度, 取值有:
   
    l 用于32位的长字节
   
    w 用于16位的字
   
    b 用于8位的字节值
   
    立即数前面要加一个$符号, 寄存器前面要加%符号。
   
    8个通用的寄存器是用于保存数据的最常用的寄存器, 这些寄存器的内容可以传递
   
    给其他的任何可用的寄存器。 和通用寄存器不同, 专用寄存器(控制, 调试, 段)
   
    的内容只能传送给通用寄存器, 或者接收从通用寄存器传过来的内容。
   
    在对标签进行引用时:
   
    例:
   
    .section .data
   
    value:
   
    .int 100
   
    _start:
   
    movl value, %eax
   
    movl $value, %eax
   
    movl %ebx, (%edi)
   
    movl %ebx, 4(%edi)
   
    其中:movl value, %eax     只是把标签value当前引用的内存值传递给eax
   
    movl $value, %eax    把标签value当前引用的内存地址指针传递给eax
   
    movl %ebx, (%edi)    如果edi外面没有括号那么这个指令只是把ebx中的
   
    值加载到edi中, 如果有了括号就表示把ebx中的内容
   
    传送给edi中包含的内存位置。
   
    movl %ebx, 4(%edi) 表示把edi中的值放在edi指向的位置之后的4字节内存位置中
   
    movl %ebx, -4(%edi) 表示把edi中的值放在edi指向的位置之前的4字节内存位置中
   
    cmove 指令(条件转移):
   
    cmovex 源操作数, 目的操作数。 x的取值为:
   
    无符号数:
   
    a/nbe    大于/不小于或者等于
   
    ae/nb    大于或者等于/不小于
   
    nc       无进位
   
    b/nae    小于/不大于等于
   
    c        进位
   
    be/na    小于或等于/不大于
   
    e/z      等于/零
   
    ne/nz    不等于/不为零
   
    p/pe     奇偶校验/偶校验
   
    np/po    非奇偶校验/奇校验
   
    有符号数:
   
    ge/nl    大于或者等于/不小于
   
    l/nge    小于/不大于或者等于
   
    le/ng    小于或者等于/不大于
   
    o        溢出
   
    no       未溢出
   
    s        带符号(负)
   
    ns       无符号(非负)
   
    交换数据:
   
    xchg     在两个寄存器之间或者寄存器和内存间交换值
   
    如:
   
    xchg 操作数, 操作数, 要求两个操作数必须长度相同且不能同时都是内存位置
   
    其中寄存器可以是32,16,8位的
   
    bswap    反转一个32位寄存器的字节顺序
   
    如: bswap %ebx
   
    xadd 交换两个值 并把两个值只和存储在目标操作数中
   
    如: xadd 源操作数,目标操作数
   
    其中源操作数必须是寄存器, 目标操作数可以是内存位置也可以是寄存器
   
    其中寄存器可以是32,16,8位的
   
    cmpxchg
   
    cmpxchg source, destination
   
    其中source必须是寄存器, destination可以是内存或者寄存器, 用来比较
   
    两者的值, 如果相等,就把源操作数的值加载到目标操作数中, 如果不等就把
   
    目标操作数加载到源操作数中,其中寄存器可以是32,16,8位的, 其中源操作
   
    数是EAX,AX或者AL寄存器中的值
   
    cmpxchg8b 同cmpxchg, 但是它处理8字节值, 同时它只有一个操作数
   
    cmpxchg8b destination
   
    其中destination引用一个内存位置, 其中的8字节值会与EDX和EAX寄存器中
   
    包含的值(EDX高位寄存器, EAX低位寄存器)进行比较, 如果目标值和EDX:EAX
   
    对中的值相等, 就把EDX:EAX对中的64位值传递给内存位置, 如果不匹配就把
   
    内存地址中的值加载到EDX:EAX对中
   
    4, 堆栈
   
    ESP 寄存器保存了当前堆栈的起始位置, 当一个数据压入栈时, 它就会自动递减,
   
    反之其自动递增
   
    压入堆栈操作:
   
    pushx source, x取值为:
   
    l 32位长字
   
    w 16位字
   
    弹出堆栈操作:
   
    popx source
   
    其中source必须是16或32位寄存器或者内存位置, 当pop最后一个元素时ESP值应该
   
    和以前的相等
   
    5,压入和弹出所有寄存器
   
    pusha/popa     压入或者弹出所有16位通用寄存器
   
    pushad/popad   压入或者弹出所有32位通用寄存器
   
    pushf/popf     压入或者弹出EFLAGS寄存器的低16位
   
    pushfd/popfd   压入或者弹出EFLAGS寄存器的全部32位
   
    6,数据地址对齐
   
    gas 汇编器支持。align 命令, 它用于在特定的内存边界对准定义的数据元素, 在数据段
   
    中。align命令紧贴在数据定义的前面
   
    比较:
   
    cmp operend1, operend2
   
    进位标志修改指令:
   
    CLC          清空进位标志(设置为0)
   
    CMC          对进位标志求反(把它改变为相反的值)
   
    STC          设置进位标志(设置为1)
   
    循环:
   
    loop            循环直到ECX寄存器为0
   
    loope/loopz     循环直到ecx寄存器为0 或者没有设置ZF标志
   
    loopne/loopnz   循环直到ecx为0或者设置了ZF标志
   
    指令格式为: loopxx address    注意循环指令只支持8位偏移地址
返回列表