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 终止符。

另一件事是,根据您的示例,计数似乎应该按降序打印。我没有看到你在任何地方这样做。
如果您修复了POLE声明并使用了示例中的单词,您应该得到输出020130000。也许这已经足够好了(?)。

于 2013-05-16T06:04:26.280 回答