Строго говоря, ваш "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: Синтаксис "ASM" применим ко всем GCC на основе компиляторов.
PPS: Я абсолютно рекомендуем вам поэкспериментировать с узлом где-нибудь пожалуйста: встроенные системы, Ubuntu, Mac OSX - все, что вам угодно.
Вот отличная книга. Речь идет о Linux, но также в значительной степени применимо к вашему OSX:
Programming from the Ground Up, 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»).
Какой компилятор и платформа? – interjay
Apple LLVM version 6.0 (clang-600.0.56) (на основе LLVM 3.5svn) на OSX Yosemite – Zilong
Это может означать, что 'r' является значением слова памяти адреса' 0x0019' –