• 王道408计组汇编语言部分学习总结


    x86汇编语言指令基础

    x86处理器中程序计数器PC 通常被称为IP 

    高级语言—>汇编语言—>机器语言

    x86架构CPU,有哪些寄存器

    EAX通用寄存器
    EBX
    ECX
    EDX
    ESI

    变址寄存器

    变址寄存器可用于线性表、字符串的处理
    EDI
    EBP堆栈基指针堆栈寄存器用于实现函数调用
     
    ESP堆栈顶指针
    1. mov eax, ebx       
    2. #寄存器—>寄存器
    3. mov eax, dword ptr [af996h]       
    4. #主存→寄存器
    5. mov eax, 5     
    6. #立即数—>寄存器
    7. moveax, dword ptr[ebx]     
    8. #将ebx所指主存地址的32bit复制到eax寄存器中
    9. mov dword ptr [ebx], eax   
    10. #将 eax的内容复制到ebx所指主存地址的32bit
    11. mov eax, byte ptr [ebx]   
    12. #将ebx所指的主存地址的8bit复制到eax
    13. mov eax, [ebx]   
    14. #若未指明主存读写长度,默认32 bit
    15. mov [af996h], eax   
    16. #将eax的内容复制到af996h所指的地址(未指明长度默认32bit)
    17. mov eax, dword ptr [ebx+8
    18. #将ebx+8所指主存地址的32bit复制到eax寄存器中

     常用的x86汇编指令

    1. 常见的算数运算指令

    addadd d,s#计算d+s,结果存入d
    subtractsub d,s#计算d-s,结果存入d
    multiplymul d,s#无符号数d*s,乘积存入d
    imul d,s#有符号数d*s,乘积存入d
    dividediv s#无符号数除法edx:eax/s,商存入eax,余数存入edx(被除数已经放到edx:eax中)
    idiv s#有符号数除法edx:eax/s,商存入eax,余数存入edx
    取负数negativeneg d#将d取负数,结果存入d
    自增++increaseinc d#将d++,结果存入d .
    自减--decreasedec d#将d--,结果存入d

    d:destination,目的地(如:寄存器或内存)

    s:source,来源地(寄存器,主存,常量)

    目的操作数d不可以是常量(因为是把s的东西放到d里)

    举例:

    add , / sub Kreg>,
    add , / sub ,
    add , / sub ,
    add , / sub ,
    add , / sub ,


    的意思是:|寄存器|register
    的意思是:|内存|memory
    的意思是:|常数|constant


    sub eax, 10 #eax←eax-10
    add byte ptr [var], 10 #10与var值指示的内存地址的一-字节值相加,并将结果
    保存在var值指示的内存地址的字节中

    2. 常见的逻辑运算指令 

    andand d,s#将d、s逐位相与,结果放回d
    oror d,s#将d、s逐位相或,结果放回d
    notnot d#将d逐位取反,结果放回d
    异或exclusive orxor d,s#将d、s逐位异或,结果放回d
    左移shift leftshI d,s#将d逻辑左移s位,结果放回d (通常s是常量)
    右移shift rightshr d,s#将d逻辑右移s位,结果放回d (通常s是常量)

    3. 其他指令

    用于实现分支结构、循环结构的指令: cmp、 test、 jmp、 jxxx
    用于实现函数调用的指令: push、pop、call、 ret
    用于实现数据转移的指令: mov

    3.1 无条件转移指令jmp
    1. jmp <地址>
    2. #PC无条件转移至<地址>
    3. jmp 128
    4. #<地址>可以用常数给出
    5. jmp eax
    6. #<地址>可以来自于寄存器
    7. jmp [999]
    8. #<地址>可以来自于主存
    9. jmp NEXT
    10. mov ecx,ebx
    11. NEXT:
    12. mov ecx,eax
    13. #<地址>可以用“标号”锚定
    3.2 条件转移指令j***
    1. je <地址>
    2. #jump when equal, 若a==b则跳转
    3. jne <地址>
    4. #jump when not equal, 若a !=b则跳转
    5. jg <地址>
    6. #jump when greater than, 若a>b则跳转
    7. jge <地址>
    8. #jump when greater than or equal to,若a>=b则跳转
    9. jl <地址>
    10. #jump when less than, 若a<b则跳转
    11. jle <地址>
    12. #jump when less than or equal to, 若a<=b则跳转
    1. cmp eax,ebx #比较寄存器eax和ebx里的值
    2. jg NEXT #若eax > ebx,则跳转到 NEXT:

    3.3 函数调用指令

    1. 函数调用指令: call<函数名>
    2. 函数返回指令: ret

    call指令的作用:
    ①将IP旧值压栈保存(保存在函数的栈帧顶部)
    ②设置IP新值,无条件转移至被调用函数的第一条指令
    ret指令的作用:
    从函数的栈帧项部找到IPI旧值,将其出栈并恢复IP寄存器

     

    1. push eax #将寄存器eax的值压栈
    2. push 985 #将立即数985压栈
    3. push [ebp+8] #将主存地址[ebp+8]里的数据压栈
    4. pop eax #栈项元素出栈,写入寄存器eax
    5. pop [ebp+8] #栈项元素出栈,写入主存地址:[ebp+8]

    push. pop指令实现入栈、出栈操作,x86 默认以4字节为单位。指令格式如下:
    Push A  //先让esp减4,再将A压入
    Pop B  //栈项元素出栈写入B,再让esp加4
    注1:A可以是立即数、寄存器、主存地址:
    注2:B可以是寄存器、 主存地址
     

  • 相关阅读:
    FT2004(D2000)开发实战之W25X10CL固件烧写
    使用YOLOv5-C3模块识别图像天气 - P8
    10 款超强大性能测试工具,你用过哪几款呢?
    【无标题】
    函数及其应用(2)——湖南工商大学
    《Terraform 101 从入门到实践》 Functions函数
    SQL基础培训-SQL开发思路畅谈与开发规范
    聊一下C#中的lock
    JVM内存模型与类加载机制
    网络通信过程的解析
  • 原文地址:https://blog.csdn.net/weixin_53197693/article/details/132857718