私は腕の組み立てが初めてで、学校のプロジェクトにarmsimを使用しています。複数の問題があります。
- txtfile から複数行を読み取る必要があり、各行には (1 行あたり) 最大 85 バイトの文字列があります。私のプログラムは最初の行しか読みません。残りのファイルを読む方法がわかりません。
- 各行から各文字を取得し、文字値が「a」と呼ばれる場合は 13 を追加する必要があります ((a>=65 && a<=77) || (a>=97 && a<=109))。((a>=78 && a<=109)||(a>=110 && a<=122)) の場合、13 を減算する必要があります。(a==32) の場合、スペースを出力して次の文字に移動します。ブランチを使用してこれを行う方法がわかりません...
ループは文字ごとに処理し、文字を stdout に出力します。これまでのコードは次のとおりです...これに何日も何時間も費やしましたが、これに頭を悩ませることはできません。私は今までJavaにしか触れていませんでした。
.equ SWI_Open, 0x66 @open a file
.equ SWI_Close,0x68 @close a file
.equ SWI_PrChr,0x00 @ Write an ASCII char to Stdout
.equ SWI_PrStr, 0x69 @ Write a null-ending string
.equ SWI_PrInt,0x6b @ Write an Integer
.equ SWI_RdInt,0x6c @ Read an Integer from a file
.equ SWI_RdStr, 0x6a @ Read string from file
.equ Stdout, 1 @ Set output target to be Stdout
.equ SWI_Exit, 0x11 @ Stop execution
.global _start
.text
_start:
ldr r0,=InFileName @ set Name for input file
mov r1,#0 @ mode is input
swi SWI_Open @ open file for input
ldr r1,=InFileHandle
str r0,[r1]
ldr r7,[r1]
ldr r1,=array
mov r2,#85
swi SWI_RdStr @stores the string into =array
mov r5,#0 @r5 is index
loop: @processes a single char then loops back
cmp r5,r2 @r2 is 83
bge procstop
ldrb r4,[r1,r5] @loads the character value from =array[r5] into r4
cmp r4,#77
ble add
cmp r4,#65
bge add
cmp r4,#97
bge add
cmp r4,#109
ble add
cmp r4,#78
bge sub
cmp r4,#90
ble sub
cmp r4,#110
bge sub
cmp r4,#122
ble sub
add:
add r4,r4,#13
sub:
sub r4,r4,#13
mov r0,r4
swi SWI_PrChr
strb r4,[r1,r5]
add r5,r5,#1
B loop
procstop:
mov r0,#Stdout
swi SWI_PrStr
swi SWI_Exit
.data
InFileName: .asciz "lab4.txt"
EndOfFileMsg: .asciz "End of file reached\n"
ColonSpace: .asciz": "
NL: .asciz "\n " @ new line
array: .skip 85
.align
InFileHandle: .word 0
.end