严格来说,你的 "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 %u\n", 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 %u\n"
.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:所有基于gcc的编译器都适用“asm”语法。
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”语法。Gcc使用ATT。ATT语法也适用于GCC支持的任何其他架构(MIPS、PPC等等)。我建议您从ATT语法(“gcc/gas”)开始入门,而不是Intel(“nasm”)。
r
是地址为0x0019
的内存单元的值。 - Basile Starynkevitch0x0019
的含义。 - NPE-S
编译并检查生成的汇编代码。尝试使用和不使用__asm__
,并进行比较以了解__asm__
的影响。这段代码来自哪里?上下文(您没有与我们分享)是否告诉您它应该做什么,甚至是否有任何作用? - Keith Thompson