系統程式:GNU 的組合語言

GNU 程式設計

GNU 程式簡介

GNU 與 C 語言

gcc 編譯器

glibc 函式庫

make 建置

ld 連結器

as 組譯器

ar 函式庫

objdump

objcopy

訊息

相關網站

參考文獻

最新修改

簡體版

English

簡介

本文將介紹如何利用 GNU 的 gcc 編譯器,進行組合語言程式的開發。

我們利用一個 C 語言的主程式,呼叫組合語言函數。如此可以避開直接使用組合語言的複雜性,又能有效觀察組合語言的執行結果。
這個方法利用 C 語言的 printf 印出函數傳回的結果,而不需要理解函數呼叫等較複雜的組合語言程式,這種技巧可以在各種平台上執行,是初學者學習組合語言時很有效的方法,在此推薦給讀者參考。

GNU 組合語言

在本節中,我們利用 main.c 這個主程式,呼叫組合語言中的 asmMain() 函數,然後利用 gcc 將兩者連結為執行檔,以便能印出組合語言的執行結果。

  • C 語言主程式: main.c
#include <stdio.h>

int main(void) {
  printf("eax=%d\n", asmMain());
}
  • 組合語言程式: gnu_add.s
    .text
.globl _asmMain
    .def _asmMain; .scl    2; .type 32; .endef
_asmMain:
    movl $1, %eax
    addl $4, %eax
    subl $2, %eax
    ret
  • 編譯與執行過程
C:\ccc\SP\code\ch03>gcc main.c gnu_add.s -o add

C:\ccc\SP\code\ch03>add
asmMain()=3

如果我們將組合語言換成下列的 sum.s 程式,那麼就可以印出 1+2+…+10 的結果。

    .data
sum: .long 0
    .text
.globl _asmMain
    .def _asmMain; .scl    2; .type 32; .endef
_asmMain:
    mov $1, %eax
FOR1:
    addl %eax, sum
    addl $1, %eax
    cmpl $10,%eax
    jle FOR1
    movl sum, %eax
    ret

結語

本文示範了如何使用 C 語言呼叫組合語言函數的方法,並利用此種方法繞過了直接組合語言的困難,讓組合語言的撰寫者可以在微軟的視窗系統上,利用 Cygwin 或 MinGW 等環境,開發組合語言程式。

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License