装配基础 - 输出不起作用

时间:2013-05-15 22:09:30

标签: assembly

我非常需要帮助修复程序中的输出。我应该有一个由tommorow组装的工作程序。我已经尝试了所有我能想到的东西,它仍然没有用。我应该读一个输入(几个单词),输出应该是具有相同长度的单词数,例如:

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

1 个答案:

答案 0 :(得分:0)

好的,这是我对你要做的事情的理解:

你有一个数组POLE,其中包含每个字长的计数。长度为1的字的计数存储在偏移0处,长度为2的字的计数在偏移1处,依此类推 您可以在'0'处开始计数,从而只要其中任何一个都不超过'9',就会自动获得可打印的计数。

那么为什么POLE声明为.asciz "0\n\r"?要足够大以处理1..9个字符的单词长度,它需要.asciz "000000000\n\r"。如果你发现任何长度为4的单词,它当前声明你将最终覆盖NULL终结符的方式。

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