2010-06-20 67 views
4

這是一個家庭作業問題。坦率地說,我不確定C程序如何爲彙編級別提供字符串參數。如何在ARM中使用字符串?

我具備的功能

StringSearchInString(text, searchString);

和參數

text = "Hallo Alles klar"

searchString = "ll"

我知道ARM提供的參數到寄存器R0,R1分別爲文本,搜索字符串,但我不確定這是如何與charactesr工作。如果每個字符的長度都是8位,那麼寄存器將被輸入的字符串無情地宰殺。

我已經讀過ARM APCS將參數轉換爲字,其中前4個字節存儲在寄存器中,其餘部分以相反順序加載到堆棧上。

Sooo ...什麼?我不理解這一點。字符串text將存儲在R0中,前四個字節中,「霍爾」存儲在R0中,剩下的順序與堆棧中的順序相反?我理解對嗎?我如何給他們打電話?

TL; DR:如何將一個字符串參數從一個C程序傳遞到程序集中,以及如何處理/加載/執行一些東西?

答:

在遠程情況下,任何人都在尋找解決這個問題,以及,那就是:

由於格雷格Hewgill已經表示,字符串的指針傳遞串。因此,R0中的值是字符串的地址。因此,您使用間接尋址來訪問如下所示的值:

StringSearchInString(text, searchString); // calls the ARM function... 

//Going into the ARM function... 

LDRB R4, [R0], #1 // Load the first value of R0 into R4 and skip 
        // ahead one character(8 bits) 
        // Note the "B" in LDR. It indicates that you load ONLY 1 byte! 
MOV R0, R4  // Move the value of R4 into R0. This destroys the pointer 
        // Stored in R0! Careful! 

併成功!如果你的字符串是「hallo Alles klar」,你可以將0x68加載到寄存器R0中。這是「h」的ASCII值。從這裏你應該可以開始使用字符串了。

+0

在您的答案部分,當您在第一個裝配註釋中說「並跳過」 - 您的意思是後增量R0?如果你想後增加R0--如果你想遍歷整個字符串,這是典型的 - 你會想要像「LDRB R4,[R0],#1」(由於它是單個字符增加1)。另外,當你將R4載入R0時,你是否意識到在你的下一條指令中你已經有效地破壞了(丟失)了你的字符串指針? – Dan 2010-06-20 14:32:35

+0

跳過前面或多或少是指用戶做任何他們想要做的事情之後。但是,是的,我意識到你需要你,並且我將R4插入到R0中,因爲當我跳出彙編程序進入C時,答案被存儲在寄存器R0中。然而,你是對的,這是一個相當不好的例子,我會改變它。 – IAE 2010-06-20 14:59:43

+0

沒問題,我只是想確保沒有混淆。在課堂上玩得開心,當我在學校時,ARM還沒有存在;-) – Dan 2010-06-20 15:04:39

回答

5

簡而言之,在C中,字符串作爲指針傳遞到其他地方的字符數據。例如,R0可能包含值0x01000078,該值將被解釋爲指向內存中的"Hallo Alles klar"數據的指針,後跟空字符(00字節)。這不是ARM獨有的。

+0

想象一下,但我該如何使用它?我嘗試加載寄存器,這是沒有道理的。我試着用'ADR'指向它。但編譯器抱怨。所以我不確定還有什麼要做。 – IAE 2010-06-20 11:16:43

+2

@SoulBeaver:恐怕我的ARM程序集很生鏽,因爲幾年前我只用了它,但通常你會將指針加載到寄存器中,然後使用間接尋址模式來讀取內存中的實際字符(通常是一次一個)。 – 2010-06-20 11:22:47

+0

謝謝!憑藉你的小洞見,我能夠弄清楚該怎麼做。希望其餘的應該是一件輕而易舉的事!更新了我的問題,並讓我提出了我的建議,至今只有答案。 – IAE 2010-06-20 11:48:21

相關問題