熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

一起學習在linux下使用匯編語言(5)

2013-11-13 15:24:56  來源: Oracle 

  作者luster
  摘要:好吧我們已經鋪墊了很多東西了而且看上去用匯編寫程序似乎是一個非常恐怖的事情了不過既然我們感興趣還是應該開始我們的hello world程序
   我們開始寫hello world吧
  
    好吧我們已經鋪墊了很多東西了而且看上去用匯編寫程序似乎是一個非常恐怖的事情了不過既然我們感興趣還是應該開始我們的hello world程序
  
    下面的代碼中我們准備采取直接使用內核中的系統調用的方法這是調用系統內核服務的最快的方法我們的代碼不鏈接到其他函數庫也不使用ELF解釋器而是直接和內核通訊
  
    我們分別使用nasm和gas兩種匯編器來編譯我們的程序這樣我們可以看到Intel和AT&T兩種語法格式了
  
    使用的工具
  
    當然首先我們需要匯編編譯器nasm和gas然後我們需要鏈接器-ld因為匯編編譯器是生成的只是object代碼一般的發行包的binutils裡面包括了gas和ld這兩個實用工具而對於大多數的發行包(例如DebianSuSeMandrake)都有nasm
  
  Hello world!
  
    Linux是一個位的運行在保護模式下的操作系統使用的是flat memory 模式使用ELF格式的二進制代碼
  
    一個程序可以劃分為下面幾個部分 textdatabsstext是一些只讀的代碼data是可讀可寫的數據區bss則是可讀可寫的沒有初始化的數據區當然可以有其他一些標准的部分也可以使用戶自己定義的sections但是我們這裡不關心一個程序至少有text部分
  
    下面就是我們的第一個程序helloworld我們給出兩個版本分別是nasm和gas兩種
  
  NASM (helloasm)
  
  section data ;section declarationmsg db Hello world!
  xa ;our dear stringlen equ $ msg ;length of our dear stringsection text ;
  section declaration ;we must export the entry point to the ELF linker
  or global _start ;loader They conventionally recognize _start as their ;
  entry point Use ld e foo to override the default_start:;write our string
  to stdout mov edxlen ;third argument: message length mov ecxmsg ;second
  argument: pointer to message to write mov ebx ;first argument: file handle
  (stdout) mov eax ;system call number (sys_write) int x ;call kernel;
  and exit mov ebx ;first syscall argument: exit code mov eax ;system
  call number (sys_exit) int x ;
  call kernel
   GAS (helloS)
  
  data # section declarationmsg: string Hello world!
  # our dear string len = msg # length of our dear stringtext
  # section declaration # we must export the entry point to the ELF linker or
  global _start # loader They conventionally recognize _start as their
  # entry point Use ld e foo to override the default_start:
  # write our string to stdout movl $len%edx # third argument:
  message length movl $msg%ecx # second argument: pointer to message to
  write movl $%ebx # first argument: file handle (stdout) movl $%eax
  # system call number (sys_write) int $x # call kernel# and exit movl
  $%ebx # first argument: exit code movl $%eax # system call number
  (sys_exit) int $x # call kernel
  
    建立可運行的程序
  
    要生成一個可執行的代碼首先就是用源代碼編譯生產一個object文件
  
    對於nasm下面的語法
  
  $ nasm f elf helloasm
  
    而對於gas而用下面的語法
  
  $ as o helloo helloS
  
    這樣就得到了helloo這個object文件了
  
    然後我們就要使用這個object文件來生成可執行代碼這裡使用鏈接器鏈接
  
  $ ld s o hello helloo
  
    這樣我們就獲得了我們的可以執行的代碼helloworld
  
    我們的學習就告一段落了更多的信息可以去參考
  
  
  
    by Luster(cn)
  
  
  

From:http://tw.wingwit.com/Article/program/Oracle/201311/16663.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.