使用教材
《汇编语言程序设计》
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格式
asm ("assembly code" : output locations : input operands : changed registers);
使用占位符
使用占位符.png使用替换的占位符
替换的占位符
%[name] "constraint" (variable)
改动的寄存器列表 changed registers
改动的寄存器列表 changed registers- 一个寄存器被用到了,但是既不是作为输入值被用、也不是作为输出值被用,就需要在 changed registers 字段写出来
处理跳转
处理跳转- 绿色部分都是标号,是程序员自己命名的
- 黄色部分是修饰符,是扩展ASM的规范:
f forward
、b 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 / jmp
是 ATT汇编的语法
%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
网友评论