0

プログラムの出力を修復するのにどうしても助けが必要です。明日までにアセンブリで作業プログラムを作成することになっています。考えられることはすべて試しましたが、まだうまくいきません。入力 (数単語) を読み取ることになっており、出力は同じ長さの単語数である必要があります。たとえば、次のようになります。

input: hello world my name is dummy
output: 3 2 1

すべて IO でシミュレートする必要があります。これが私のコードです。気をつけてください。私は初めてアセンブリのイースターを見ました。

.h8300s
.equ syscall,0x1FF00            ;simulated IO area
.equ PUTS,0x0114                ;kod PUTS
.equ GETS,0x0113                ;kod GETS

;-------------------[ PROCEDURY ]--------------------------------

nacti_slovo:
        MOV.B   @ER2, R6H       ;nacteni prvniho znak
        CMP.B   #0xA, R6H         
        BEQ     uloz_slovo      ;kdyz je na konci retezce, tak skocim do ukladani
        CMP.B   #' ', R6H       
        BEQ     uloz_slovo      ;kdyz je znak mezera, tak ulozit
        ADD.L   #1,ER3          ;navyseni pocitadla o 1
        INC.L   #1, ER2         ;posunuti ukazatele ER2 na dalsi znak
        BRA     nacti_slovo     ;zopakovani smycky

uloz_slovo:
        MOV.L   #POLE, ER4      ;nacteni adresy pole
        ADD.L   #-1, ER3
        ADD.L   ER3, ER4        ;posunuti na spravny byte
        MOV.B   @ER4, R5L       ;nacteni hodnoty z ER4 do R5L
        ADD.B   #1,R5L          ;navyseni poctu slov o 1
        mov.b   R5L,@ER4        ;ulozeni poctu slov zpet do pameti

        CMP.B   #0xA, R6H         
        BEQ     konec_vstupu    ;pokud je konec retezce, program se ukonci
        XOR.L   ER3,ER3         ;vynulovani pocitadla, pokud nejsme na konci retezce
        INC.L   #1, ER2         ;posunuti v retezci o znak dal
        BRA     nacti_slovo     ;skok zpet do smycky

konec_vstupu:
        rts

;----------------[ DATOVA SEKCE ]-------------------------

.data    

TEXT:   .space 96               ;input 
POLE:   .asciz "0\n\r"              ;output

        .align 2                ;zarovnani adresy
cTest:  .long POLE      
cVstup: .long TEXT              ;parametricky blok input

stck:
        .align 1
        .space 200

;----------------[ HLAVNI PROGRAM ]-------------------------

.text           
.global _start

_start:

        mov.l #stck,ER7

        xor.l ER1,ER1
        xor.l ER2,ER2
        xor.l ER3,ER3           ;vynulovani registru    
        xor.l ER4,ER4
        xor.l ER5,ER5

        mov.w #GETS,R0          ;24bitovy GETS
        mov.l #cVstup,ER1       ;adr. param. bloku do ER1
        jsr @syscall

        MOV.L #TEXT, ER2    ;presunu odkaz na zacatek textu

        jsr nacti_slovo     

        mov.w   #PUTS,R0        ;24bit PUTS
        mov.l   #cTest,ER1      ;add. param. block to ER1 
        jsr     @syscall

end:    bra end

.end
4

1 に答える 1

0

さて、あなたがやろうとしていることについての私の理解は次のとおりです。

POLE各単語の長さのカウントを含む配列があります。長さ 1 のワードのカウントはオフセット 0 に格納され、長さ 2 のワードのカウントはオフセット 1 に格納されます。
からカウントを開始すると'0'、 を超えない限り、印刷可能なカウントが自動的に取得されます'9'

では、なぜ とPOLE宣言されているの.asciz "0\n\r"でしょうか? 1..9 文字の長さの単語を処理するのに十分な大きさにするには、.asciz "000000000\n\r". 現在宣言されている方法では、長さ 4 の単語が見つかった場合、NULL ターミネータを上書きすることになります。

もう1つのことは、あなたの例によれば、カウントを降順で出力する必要があるように見えるということです。あなたがそんなことをしているのを見たことがありません。
宣言を修正しPOLE、例の単語を使用すると、出力が得られるはずです020130000。それだけでいいのかもしれません(?)。

于 2013-05-16T06:04:26.280 に答える