簡體   English   中英

在c中理解匯編代碼

[英]Understand assembly code in 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: %u\n", 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 %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:

從頭開始編程,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”)開始,而不是英特爾(“nasm”)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM