我對mips非常陌生。我不知道從哪里開始:
假設我有
li $t1, -3
li $t2, -9
我想列印一個字串
(-3,-9)
我將其存盤在什么資料結構中?。位元組?。空間?
這是我到目前為止所擁有的,它列印出“(,)”;我在正確的軌道上嗎?我從這里去哪里?
string: .space 10
.text
.globl main
main: la $t0, string
li $t1, -3
li $t2, -9
li $t3, '('
li $t4, ','
li $t5, ')'
li $t6, '-'
sb $t3, ($t0)
sb $t4, 1($t0)
sb $t5, 2($t0)
j exit
exit:
li $v0, 4 # print the string
la $a0, string
syscall
li $v0, 10 # terminate program
syscall
uj5u.com熱心網友回復:
匯編 (MIPS/MARS) 使用 C 風格的以 nul 結尾的字串 — 一個 nul 字符,'\0' ascii 值 0,放在末尾并被解釋為結束字串,但它本身不是字串的一部分。
因此,請記住以空值終止您的字串。還要記住分配比字串所需的多 1 個位元組的存盤空間,以保存該 nul 位元組。請注意,該.space指令將為您提供最初為零的存盤,但如果您多次使用該存盤,那么您可能希望動態地終止。如果您將“(-82,-45)”放在那里,然后重新啟動以進行另一次轉換,則從頭開始放“(-9,-3)”-沒有零終止,它實際上將保持“(-9,- 3)5)",帶有前面的剩余字符。
如果您要將數字轉換為字符,則需要一種稱為itoa(代表整數到 ascii)或列印數字或將數字轉換為字串的演算法。這些非常簡單,并且有很多,盡管它們都很相似。這個想法是使用數學來產生/提取單個數字,然后一次只有一個數字,轉換為它們的 ascii 等價物以列印或放入字串。
大多數itoa演算法將檢查 < 0,如果是,則發出一個-符號,然后否定該數字并繼續進行,就好像它是正數(一旦被否定,它就是)。
最簡單的itoa方法是,例如,如果您知道最多需要 2 位數字,則通過將該數字除以 10 來隔離高位數字。因此,對于 45,則 45/10=4,然后添加“0”又名 48 到那個,你將有 52,這是字符 '4' 的 ascii 代碼。接下來將你的 45 和 mod 乘以 10,所以 45=5,再加上 48 得到 53,即 '5' 的代碼。您可以將其概括為一個回圈。
一些演算法向后作業以產生數字,因為這很容易做到:首先除以 10,然后除以 10,然后重復直到值變為空 (0)。456->6, 456/10->45, 下一個 45->5, 45/10->4, 下一個 4->4 和 4/10->0 所以你停下來。6、5、4,列印或復印只需反轉。
您無需為此考慮匯編語言,因為任何語言都可以將位元組操作為字串。你想從演算法上思考(而不是在匯編中)。以上可以在 C 中完成,如果您不知道,在匯編中進行演算法思考是很困難的;在匯編中這樣做之前了解您要撰寫的代碼也很有用。撰寫 C 版本,然后將其轉換為匯編是值得的。
.space將保留在程式啟動時初始化為零的全域存盤。
您也可以分配堆疊空間或從堆中分配,但這兩者都比全域分配更復雜。
你的開始沒問題,只需要在其中itoa加入一些演算法。
因為翻譯數字有時會導致不同的字符數(例如,3 是一個字符長,但 -3 和 45 都是兩個字符長)。您的itoa方法將使用一個變數來告知下一個存盤位置(哪個位元組),而不是像您當前正在使用的那樣使用固定偏移量。選擇使用變數時,可以使用指標或索引。在這里使用指標是很自然的,但要明確的是,索引也可以作業,并且任何一個都可以在 C 中完成,也可以在匯編中完成。向字串中添加字符時,指標或索引需要前移,因此您始終知道下一步該去哪里(以及在將字符放入字串中后將 nul 終止符放在哪里)。
由于您要將 2 個不同的數字轉換為字串,因此一個好的方法可能會使用函式來提供幫助;然而,函式增加了匯編的復雜性;這種復雜性可能最好在其他基礎知識之后再學習。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430129.html
上一篇:對堆疊中的值地址感到困惑
