2016-10-12 10 views
0

MIPSプログラムを作成していますが、入力として大文字または小文字しか使用できません。私のプログラムは文字のASCII値を使って動作します。値が2つの範囲のうちの1つの範囲内にあるかどうかのテスト

入力の各文字がASCII範囲65-90(A-Z)か97-122(a-z)かどうかを確認する必要があります。これらの範囲にない場合は、この文字をスキップして次の文字を繰り返します。これはどうすればできますか?ここで

EDIT

は、私はちょうど思い付いたが、私はこれを行うに少ない醜い方法があると確信しているソリューションですか?

function: #increment $t0 to next char of input 
      blt $t0, 65, function 
      bgt $t0, 122, function 
      blt $t0, 91, continue 
      bgt $t0, 96, continue 
      j function 
continue: ... 
      j function 

答えて

0

どんなにあなたが何をすべきか、あなたは分岐は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-Za-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)


ここにルックアップテーブルを作成する追加のバージョンがあります。それをあらかじめ構築するにはもう少し時間がかかりますが、実際のループは高速です。さまざまなバージョンbltbgtにおいて

それぞれsltiを生成する擬似OPS、bneaddiと、sltibneあります。したがって、我々は実際には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 
+0

ありがとう!私は自分の質問に直接関係しないMIPSに関するいくつかのことを学びました。自分の質問を削除したり、自分の編集で解決策を思いついたときに答えるつもりだったので、嬉しいです。 – KOB

+0

あなたは大歓迎です!私の答えを参照してください:http://stackoverflow.com/questions/36538325/mips-linked-list/36560575#36560575良いasmのスタイル、コメント、C /疑似コードのプロトタイプ、asmコードを書く自分の経験に基づいて追加情報 –

+0

こんにちはクレイグ、これは少し関係がありませんが、私はポーリングを使ってメモリマップされたI/Oがどのように起こっているのかをちょっと調べるのに苦労しています。私は非常に動作していない私の試行されたソリューションで質問をしました:http://stackoverflow.com/questions/40051870/memory-mapped-i-o任意のヒントは素晴らしいだろう! – KOB

関連する問題