我非常需要帮助修复程序中的输出。我应该有一个由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
答案 0 :(得分:0)
好的,这是我对你要做的事情的理解:
你有一个数组POLE
,其中包含每个字长的计数。长度为1的字的计数存储在偏移0处,长度为2的字的计数在偏移1处,依此类推
您可以在'0'
处开始计数,从而只要其中任何一个都不超过'9'
,就会自动获得可打印的计数。
那么为什么POLE
声明为.asciz "0\n\r"
?要足够大以处理1..9个字符的单词长度,它需要.asciz "000000000\n\r"
。如果你发现任何长度为4的单词,它当前声明你将最终覆盖NULL终结符的方式。
另一件事是,根据你的例子,似乎计数应该按降序打印。我没有看到你在任何地方这样做
如果您修复了POLE
声明并使用了示例中的字词,则应获得输出020130000
。也许这已经足够好了(?)。