Моя программа создает 2d массив в памяти с .skip 1000
.Затем он заполняет этот массив входом из stdin
, используя этот цикл:
@@loop to store message in array
@outer for loop over rows
MOV r0,#0 @r0 = i (row index)
msgrowloop:
CMP r0,r2 @compare to nrows
BEQ msgendrowloop
@multiply/accumulate instruction
MLA r7, r3, r0, r6 @calculates the address of the first element in each row
@inner for loop over columns
MOV r1,#0 @r1 = j (column index)
msgcolumnloop:
CMP r1,r3 @compare to ncolumns
BEQ msgendcolumnloop
@@@store from stdin
PUSH {r0-r4}
BL getchar @branch & link to getchar - reads single character from stdin
CMP r0,#-1 @check if we're at the end of file
BEQ msgendrowloop @if so, exit loop
MOV r8, r0 @move character to r8
POP {r0-r4}
@@@store from stdin end
@store r8 in memory and increase r7 by one byte
STRB r8,[r7],#1
ADD r1,r1,#1 @j += 1
B msgcolumnloop
msgendcolumnloop:
ADD r0,r0,#1 @i += 1
B msgrowloop
msgendrowloop:
@rest of the program...
Теперь, используя это, я получаю ошибку сегментации, но если я изменю свою функцию stdin на эту:
PUSH {r0-r4}
BL getchar @branch & link to getchar - reads single character from stdin
CMP r0, #-1 @check if we are at end of file
MOV r8, r0 @move character to r8
POP {r0-r4}
BEQ msgendrowloop @exit loop when done
Вместо этого:
PUSH {r0-r4}
BL getchar @branch & link to getchar - reads single character from stdin
CMP r0,#-1 @check if we're at the end of file
BEQ msgendrowloop @if so, exit loop
MOV r8, r0 @move character to r8
POP {r0-r4}
Работает отлично.Логика здесь сбивает с толку, так как мой оригинальный код кажется логически обоснованным.