美文网首页
[内联汇编]扩展asm:格式、占位符、跳转、内联汇编宏函数

[内联汇编]扩展asm:格式、占位符、跳转、内联汇编宏函数

作者: AkuRinbu | 来源:发表于2019-04-23 16:31 被阅读0次

    使用教材

    《汇编语言程序设计》
    https://www.jianshu.com/p/8473cd0e92b6
    第13章 使用内联汇编

    学习资料

    GCC-Inline-Assembly-HOWTO
    https://ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

    Inline Assembler
    https://docs.microsoft.com/en-us/cpp/assembler/inline/inline-assembler?view=vs-2019

    学习笔记

    扩展asm格式
    使用占位符
    使用替换的占位符
    处理跳转
    改动的寄存器列表 changed registers
    内联汇编宏函数

    asm格式

    • GNU的C编译器 使用 asm关键词指出使用汇编语言编写的源代码

    asm ("assembly code")

    扩展asm格式

    asm ("assembly code" : output locations : input operands : changed registers);

    扩展asm格式

    使用占位符

    使用占位符.png

    使用替换的占位符

    %[name] "constraint" (variable)

    替换的占位符

    改动的寄存器列表 changed registers

    改动的寄存器列表 changed registers
    • 一个寄存器被用到了,但是既不是作为输入值被用、也不是作为输出值被用,就需要在 changed registers 字段写出来

    处理跳转

    处理跳转
    • 绿色部分都是标号,是程序员自己命名的
    • 黄色部分是修饰符,是扩展ASM的规范: f forwardb backward

    内联汇编宏函数

    内联汇编宏函数
    • 第一步,看懂占位符
      %0 代表存着result值的寄存器
      %1 代表存着a值的寄存器
      %2 代表存着b值的寄存器

    • 第二步,看懂跳转
      jge : Jump Greater/Equal or Jump Not Less
      cmp %1, %2 就是 compare a,b
      jge 0f
      如果b更大的话,就跳转到标号0(即 0: 这里)
      如果a更大的话,就直接顺序执行
      jmp 1f 就是无条件地直接跳转到标号1(即1:这里)

    cmp / jge / jmpATT汇编的语法
    %0 %1 %2 是占位符,是 扩展asm的规范
    0f / 1f 0、1是标号、f是修饰符、是 扩展asm的规范

    #APP
    # 21 "mactest2.c" 1
        cmp %eax, %edx
        jge 0f
        movl %eax, %eax
        jmp 1f
        0:
        movl %edx, %eax
        1:
    # 0 "" 2
    #NO_APP
    
    • 第三步,看懂如何修改result
      movl %1, %0 就是 result = a
      movl %2, %0 就是 result = b

    参考资料

    • 更多内联汇编代码实例

    [OS64位][019]源码阅读:程序4-5 i=1/0 除法错误
    https://www.jianshu.com/p/e14045176526

    相关文章

      网友评论

          本文标题:[内联汇编]扩展asm:格式、占位符、跳转、内联汇编宏函数

          本文链接:https://www.haomeiwen.com/subject/uvdugqtx.html