バイナリファイルを開いてすべてのバイトを読み取る簡単なプログラムを作成しますか?私は以下のコードARMアセンブリでバイナリファイルを読む
...
ldr r0, =binaryfile
mov r1, #2
mov r7, #5
svC#0
loop:
ldr r0,=Handle
ldr r0,[r0]
ldr R1,=Array
mov R2,#80
mov r7,#3 @read syscall
svC#0
...
Handle: .skip 4
Array: .skip 80
binaryfile: .asciz "file.bin"
.end
しかし、オープンシステムコールの後で、このシステムコール(https://android.googlesource.com/platform/bionic/+/cd58770/libc/SYSCALLS.TXT)とAndroidデバイスを使用してこれを実行しようとすると、ハンドルの値はいずれも提案常に0xfffffffe
のですか?
'strace'の下でプログラムを実行すると、システムコールがすべて記録されます。間違った引数を渡すとエラーを捕まえる簡単な方法です。ところで、失敗したシステムコールは常に '-ERRNO'を返します。したがって、errno = -2の意味を調べることができます。たぶんEFAULT、ENOENT、または何か。 (または単にstraceを使用する) –
ちょっと待って、 'open(2)'戻り値をどこに 'Handle'に格納しますか? 'r0'にループを入力するようです。そして、それはいつもレジスタに入れておきましょうか?また、 'ldr r0、= Handle'をループから取り出すこともできます。 (ABIで 'svc#0'が戻り値以外のすべてのレジスタを保持することを確認しますが、ほとんどのプラットフォームはそのように動作します。) –