2015-03-02 99 views
2

我試圖將寄存器的整數內容寫入ARM彙編中的文本文件。 我一直在閱讀成功 - 我從閱讀技術手冊推斷出,我將需要一些SWI指令,但是我不能爲我的生活找到一個具體的例子來說明如何做到這一點。在ARM彙編中寫入文件

操作系統是在Pi B模型上運行的Raspbian。

非常感謝您的幫助,如果您需要澄清,請告訴我!

編輯:爲了澄清,我正在使用GCC成功組裝和執行我的代碼。我想將我的數據寄存器的值存儲到文本文件中。

實施例:

.global main 
.func main 

main: 
    mov r1, #19 
    mov r2, #11 
    add r0, r1, r2 
    bx lr 

在上述情況下,R0將持有我想要寫該值的文本文件的值30。

+0

這是很容易得到當你問具體問題的幫助。 – auselen 2015-03-02 19:23:47

+0

@auselen - 我還能補充些什麼?假設一個簡單的彙編程序,它將r0中的值3存儲起來。我現在想把r0的內容寫入一個txt文件。我不確定你還想要什麼,但請告訴我。 – foaf 2015-03-02 19:28:08

+1

向文件寫入'3'不像寫入任何整數。你能用C語言寫'itoa'嗎?你知道如何將「3」寫入文本文件嗎?爲什麼不只是STDOUT?你知道文件和STDOUT之間的區別嗎?您是否可以使用這些工具從彙編文件生成可執行文件?由於我不知道你的基金會,我不知道從哪裏開始回答。 – auselen 2015-03-02 19:54:18

回答

1

我確實嘗試了一下,想想事先需要知道的事情。當然,有很多方法可以利用匯編程序設計,但我的目標是沒有編譯器或庫的幫助。

  • 能夠使用工具鏈正確
  • 鏈接需要一個_start符號
  • 定義字符串,解決這個問題
  • 常數爲O_WRONLYO_CREAT
  • 如何編碼的權限
  • 瞭解通話open,write,fsync,close,的簽名
  • 如何使一個系統調用
  • 某種類型的內存管理,我用堆
  • 指針一個數字的
  • ASCII表示
  • 加載/存儲寄存器,尋址模式
  • 如何調試!有趣的事情,我開始認爲這應該是直截了當的,只是爲了找出困難的方式,你需要調用fsync退出該過程之前問內核沖洗。可能O_DIRECT | O_SYNC是一個更容易的選擇。

    $ as open_e.s -o open_e.o 
    $ ld open_e.o -o open_e 
    $ cat open_e.s 
    .global _start 
    
    _start: 
    @open syscall 
    ldr r0, =filename 
    mov r1, #0101 @ O_WRONLY | O_CREAT 
    ldr r2, =0666 @ permissions 
    mov r7, #5 @ 5 is system call number for open 
    svC#0 
    cmp r0, #0 
    blt exit 
    
    @r0 contains fd (file descriptor, an integer) 
    mov r5, r0 
    
    @write syscall 
    @use stack as buffer 
    sub sp, #8 @ stack is full descending, this is how we leave some space 
    mov r1, #'4' 
    strb r1, [sp] 
    mov r1, #'2' 
    strb r1, [sp, #1] 
    mov r1, #'\n' 
    strb r1, [sp, #2] 
    mov r1, sp 
    mov r2, #3 
    mov r7, #4 @ 4 is write 
    svC#0 
    
    @fsync syscall 
    mov r0, r5 
    mov r7, #118 
    svC#0 
    
    @close syscall 
    mov r7, #6 @ 6 is close 
    svC#0 
    
    exit: 
    mov r0, #0 
    mov r7, #1 
    svC#0 
    
    .data 
    .align 2 
    filename: .asciz "out.txt"