我迫切需要帮助修复程序中的输出。明天我应该有一个工作程序在装配中。我已经尝试了我能想到的一切,但仍然无法正常工作。我应该读取输入(几个字),输出应该是相同长度的字数,例如:
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