理解c中的汇编代码
我正在阅读一些嵌入了几个汇编代码的C代码。 我知道__asm__
是运行汇编代码的语句,但是__asm__
在下面的代码中做了什么? 根据输出(即r = 16
),似乎__asm__
不会影响变量r
。 不是吗?
#include <stdio.h>
static void foo()
{
static volatile unsigned int r __asm__ ("0x0019");
r |= 1 << 4;
printf("foo: %un", r);
}
平台:OSX Yosemite上的Apple LLVM 6.0版(clang-600.0.56)(基于LLVM 3.5svn)
严格地说,你的“asm”片段只是加载一个常量(0x0019)。
这是一个32位的例子:
#include <stdio.h>
static void foo()
{
static volatile unsigned int r __asm__ ("0x0019");
static volatile unsigned int s __asm__ ("0x1122");
static volatile unsigned int t = 0x3344;
printf("foo: %u %u %un", r, s, t);
}
gcc -O0 -S x.c
cat x.c
.file "x.c"
.data
.align 4
.type t.1781, @object
.size t.1781, 4
t.1781:
.long 13124 # Note: 13124 decimal == 0x3344 hex
.local 0x1122
.comm 0x1122,4,4
.local 0x0019
.comm 0x0019,4,4
.section .rodata
.LC0:
.string "foo: %u %u %un"
.text
.type foo, @function
foo:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl t.1781, %eax
movl 0x1122, %edx
movl 0x0019, %ecx
movl %eax, 12(%esp)
movl %edx, 8(%esp)
movl %ecx, 4(%esp)
movl $.LC0, (%esp)
call printf
leave
ret
PS:“asm”语法适用于所有基于gcc的编译器。
PPS:我绝对鼓励你在任何你喜欢的地方试验装配:嵌入式系统,Ubuntu,Mac OSX - 无论你喜欢什么。
这是一本很棒的书。 这是关于Linux的,但它也非常适用于您的OSX:
从头开始编程,Jonathan Bartlett
也:
https://www.hackerschool.com/blog/7-understanding-c-by-learning-assembly
http://fabiensanglard.net/macosxassembly/
PPS:x86汇编语法有两种变体:“Intel”和“ATT”语法。 海湾合作委员会使用ATT。 ATT语法也适用于GCC支持的任何其他体系结构(MIPS,PPC等)。 我鼓励你从ATT语法(“gcc / gas”)开始,而不是使用Intel(“nasm”)。
链接地址: http://www.djcxy.com/p/82989.html上一篇: Understand assembly code in c
下一篇: How can I get tooltips showing in dygraphs without annotation