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

使用教材

《汇编语言程序设计》
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:格式、占位符、跳转、内联汇编宏函数_第1张图片
扩展asm格式

使用占位符

[内联汇编]扩展asm:格式、占位符、跳转、内联汇编宏函数_第2张图片
使用占位符.png

使用替换的占位符

%[name] "constraint" (variable)

[内联汇编]扩展asm:格式、占位符、跳转、内联汇编宏函数_第3张图片
替换的占位符

改动的寄存器列表 changed registers

[内联汇编]扩展asm:格式、占位符、跳转、内联汇编宏函数_第4张图片
改动的寄存器列表 changed registers
  • 一个寄存器被用到了,但是既不是作为输入值被用、也不是作为输出值被用,就需要在 changed registers 字段写出来

处理跳转

[内联汇编]扩展asm:格式、占位符、跳转、内联汇编宏函数_第5张图片
处理跳转
  • 绿色部分都是标号,是程序员自己命名的
  • 黄色部分是修饰符,是扩展ASM的规范: f forwardb backward

内联汇编宏函数

[内联汇编]扩展asm:格式、占位符、跳转、内联汇编宏函数_第6张图片
内联汇编宏函数
  • 第一步,看懂占位符
    %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

参考资料

  • assembly_programming
    https://www.tutorialspoint.com/assembly_programming/assembly_conditions.htm
  • 更多内联汇编代码实例

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

你可能感兴趣的:([内联汇编]扩展asm:格式、占位符、跳转、内联汇编宏函数)