どんなにあなたが何をすべきか、あなたは分岐はinstsを必要としないでしょう。
まず、サイドバーのコメントを各命令に追加します。
いいコメントは、一部の言語の一部ですが、重要なのはのasmです。事実上すべての行にそれらがあるはずです。アルゴリズムのロジック(つまり、「what/why」)に対応します。指示そのものが「方法」です。
ASCII文字に10進数を使用していることに注意してください。コメントがなければ、ロジックが正しいかどうかを判断するのは難しいです。
A-Z
テストと一緒にテストし、a-z
テストを一緒にして混在させないように、グループ化を少し調整します。これはやや遅くなるかもしれませんが、コードは直感的です。
また、わかりやすく3番目のバージョンもありました。これは、固定配線10進値の代わりに文字定数を使用します。
ここで注釈を使用して、元のです:
function:
# increment $t0 to next char of input
blt $t0,65,function # less than 'A'? if yes, loop
bgt $t0,122,function # greater than 'z'? if yes, loop
blt $t0,91,continue # less than or equal to 'Z'? if yes, doit
bgt $t0,96,continue # greater than or equal to 'a'? if yes, doit
j function
continue:
# ...
j function
ここで並べ替えたバージョンです:
function:
# increment $t0 to next char of input
blt $t0,65,function # less than 'A'? if yes, loop
blt $t0,91,continue # less than or equal to 'Z'? if yes, doit
bgt $t0,122,function # greater than 'z'? if yes, loop
bgt $t0,96,continue # greater than or equal to 'a'? if yes, doit
j function
continue:
# ...
j function
はここで最も簡単なバージョンです。これは理解するのが一番簡単で、個人的にはこれをやります。余分な/無関係なj
命令も排除されます。
A-Z
がa-z
よりも小さいことを以前のバージョンで知っていなければなりませんでした。 ASCII値は10進数で「ハードワイヤード」であったため、これで「逃げる」ことができました。
Cでは、必ずしも良いアイデアではありません(つまり、文字定数を使用する)。
function:
# increment $t0 to next char of input
blt $t0,'A',trylower # less than 'A'? if yes, try lowercase
ble $t0,'Z',continue # less than or equal to 'Z'? if yes, doit
trylower:
blt $t0,'a',function # less than 'a'? if yes, loop
bgt $t0,'z',function # greater than 'z'? if yes, loop
continue:
# ...
j function
古い格言があります:次は実際に有効であるように、MIPSアセンブラは、文字定数を許可あなたがより速く(「プログラミングスタイルの要素」から、ブライアン・カーニハンとP.J.によってそれを作る直前にそれを作りますPlauger)
ここにルックアップテーブルを作成する追加のバージョンがあります。それをあらかじめ構築するにはもう少し時間がかかりますが、実際のループは高速です。さまざまなバージョンblt
とbgt
において
それぞれslti
を生成する擬似OPS、bne
addi
と、slti
、bne
あります。したがって、我々は実際には4つではなく10の命令について話しています。
したがって、テーブル構築は、より簡単で高速なループを得るには価値があります。
.data
isalpha: .space 256
.text
main:
la $s0,isalpha # get address of lookup table
li $t0,-1 # byte value
li $t2,1 # true value
# build lookup table
build_loop:
# increment $t0 to next char of input
addi $t0,$t0,1 # advance to next char
beq $t0,256,build_done # over edge? if so, table done
blt $t0,'A',build_lower # less than 'A'? if yes, try lowercase
ble $t0,'Z',build_set # less than or equal to 'Z'? if yes, doit
build_lower:
blt $t0,'a',build_loop # less than 'a'? if yes, loop
bgt $t0,'z',build_loop # greater than 'z'? if yes, loop
build_set:
addiu $t1,$s0,$t0 # point to correct array address
sb $t2,0($t1) # mark as a-z, A-Z
j build_loop # try next char
build_done:
function:
# increment $t0 to next char of input
addu $t1,$s0,$t0 # index into lookup table
lb $t1,0($t1) # get lookup table value
beqz $t1,function # is char one we want? if no, loop
continue:
# ...
j function
ここで事前に定義されたルックアップテーブルを持つバージョンがあります:における深度答えを
.data
isalpha:
.byte 0:65
.byte 1:26
.byte 0:6
.byte 1:26
.byte 0:133
.text
la $s0,isalpha # get lookup table address
function:
# increment $t0 to next char of input
addu $t1,$s0,$t0 # index into lookup table
lb $t1,0($t1) # get lookup table value
beqz $t1,function # is char one we want? if no, loop
continue:
# ...
j function
ありがとう!私は自分の質問に直接関係しないMIPSに関するいくつかのことを学びました。自分の質問を削除したり、自分の編集で解決策を思いついたときに答えるつもりだったので、嬉しいです。 – KOB
あなたは大歓迎です!私の答えを参照してください:http://stackoverflow.com/questions/36538325/mips-linked-list/36560575#36560575良いasmのスタイル、コメント、C /疑似コードのプロトタイプ、asmコードを書く自分の経験に基づいて追加情報 –
こんにちはクレイグ、これは少し関係がありませんが、私はポーリングを使ってメモリマップされたI/Oがどのように起こっているのかをちょっと調べるのに苦労しています。私は非常に動作していない私の試行されたソリューションで質問をしました:http://stackoverflow.com/questions/40051870/memory-mapped-i-o任意のヒントは素晴らしいだろう! – KOB