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