2013-04-04 61 views
2
裝配

嗯,我搜索整個互聯網的代碼將運行使用ARM-Linux的gnueabi,作爲和QEMU。 打印整數值。來自字符串。例程將有所幫助。ARM採用的Qemu

+0

我認爲人們對這個問題投了反對票,因爲它缺乏一些研究。順便說一句,這有問題,我看到了一個很好的答案。所以我決定加大對這個問題的評價,這樣它就會保持在網絡上而不是接近。 – 2013-04-04 09:21:08

回答

12

顯然還沒有搜查了整個互聯網......因爲,如果不出意外,QEMU的源代碼包含的所有問題的答案...

QEMU仿真系統。你是否試圖在模擬手臂系統上做裸機?或者你是否試圖運行arm linux操作系統,並在操作系統中創建一個程序集,該程序在qemu上運行的操作系統上運行?如果是後者則與qemu無關,這是一個操作系統問題,而不是qemu問題。它不是一個語言問題(asm),而是一個操作系統問題。 asm和low level是兩個不同的東西。 asm並不意味着低層訪問,對於低層次的東西絕對不是必需的(並且很少使用)。

如果你不感興趣的一個操作系統,但只是裸機,這裏是許多途徑獲得QEMU的控制檯上的串行輸出之一。字符串和整數等是一個無語言問題(相同的解決方案可以應用於任何編程語言,asm,c,python等)解決問題然後將語言應用於問題)。

的start.s

.globl _start 
_start: 
    ldr r0,=0x101f1000 
    mov r1,#0 
loop: 
    add r1,r1,#1 
    and r1,r1,#7 
    add r1,r1,#0x30 
    str r1,[r0] 
    mov r2,#0x0D 
    str r2,[r0] 
    mov r2,#0x0A 
    str r2,[r0] 
    b loop 

MEMMAP

MEMORY 
{ 
    rom : ORIGIN = 0x00010000, LENGTH = 32K 
} 

SECTIONS 
{ 
    .text : { *(.text*) } > rom 
} 

的Makefile

CROSS_COMPILE ?= arm-none-linux-gnueabi 

AOPS = --warn --fatal-warnings 
COPS = -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding 

hello_world.bin : startup.s memmap 
    $(CROSS_COMPILE)-as $(AOPS) startup.s -o startup.o 
    $(CROSS_COMPILE)-ld startup.o -T memmap -o hello_world.elf 
    $(CROSS_COMPILE)-objdump -D hello_world.elf > hello_world.list 
    $(CROSS_COMPILE)-objcopy hello_world.elf -O binary hello_world.bin 

運行與

qemu-system-arm -M versatilepb -m 128M -nographic -kernel hello_world.bin 

但我不知道如何擺脫控制檯

相反,如果你這樣做:

qemu-system-arm -M versatilepb -m 128M -kernel hello_world.bin 

,然後CTRL-ALT-3(不是F3,但3)將切換到串行控制檯 和您可以看到輸出,並可以通過關閉控制檯窗口關閉qemu。

在versatilepb qemu的目標發送寄存器UART是在地址0x101f1000。因爲這是一個模擬,你可以「試試」,發現寫入這個地址,而不做任何真實世界的uart設置「正常工作」,並且作爲一個仿真系統,它可能立即傳輸角色,所以你不必等待爲它完成或輪詢一個空的TX緩衝槽或類似的東西。只是爆炸。這會讓你開始,然後如果你感興趣的話,你可以嘗試在現實世界中做些什麼。 (其他目標中的其他飛鏢可能更接近現實世界,需要一些初始化,並等待空的tx buf)。

ASM使得上述比較痛苦,只是用C代替你低的水平/裸機程序。

另外,如果你使用arm裸機,你可以使用如果你知道你在做什麼,但是最終會發現arm-none-eabi更適合,因爲你沒有使用操作系統少得多的linux。

+0

謝謝,很好的答案。 – 2013-04-04 09:21:32

+0

感謝@dwelch爲這個不錯的答案,你會讓我知道在你的例子中使用memmap文件嗎? – 2014-02-25 18:05:49

+0

我在這裏調用的memmap只是一個gnu鏈接器(ld)鏈接器腳本,通常帶有文件擴展名.ld,但我還沒有符合那種習慣呢......它告訴鏈接器在鏈接時將內容放入內存的位置,程序去哪裏數據去哪裏等等。在這種情況下,所有程序都沒有數據,所以.text是所有鏈接器腳本真正需要的。 – 2014-02-25 18:37:28