這是一個家庭作業問題。坦率地說,我不確定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值。從這裏你應該可以開始使用字符串了。
在您的答案部分,當您在第一個裝配註釋中說「並跳過」 - 您的意思是後增量R0?如果你想後增加R0--如果你想遍歷整個字符串,這是典型的 - 你會想要像「LDRB R4,[R0],#1」(由於它是單個字符增加1)。另外,當你將R4載入R0時,你是否意識到在你的下一條指令中你已經有效地破壞了(丟失)了你的字符串指針? – Dan 2010-06-20 14:32:35
跳過前面或多或少是指用戶做任何他們想要做的事情之後。但是,是的,我意識到你需要你,並且我將R4插入到R0中,因爲當我跳出彙編程序進入C時,答案被存儲在寄存器R0中。然而,你是對的,這是一個相當不好的例子,我會改變它。 – IAE 2010-06-20 14:59:43
沒問題,我只是想確保沒有混淆。在課堂上玩得開心,當我在學校時,ARM還沒有存在;-) – Dan 2010-06-20 15:04:39