2016-08-20 4 views
0

バイナリファイルを開いてすべてのバイトを読み取る簡単なプログラムを作成しますか?私は以下のコード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

のですか?

+0

'strace'の下でプログラムを実行すると、システムコールがすべて記録されます。間違った引数を渡すとエラーを捕まえる簡単な方法です。ところで、失敗したシステムコールは常に '-ERRNO'を返します。したがって、errno = -2の意味を調べることができます。たぶんEFAULT、ENOENT、または何か。 (または単にstraceを使用する) –

+1

ちょっと待って、 'open(2)'戻り値をどこに 'Handle'に格納しますか? 'r0'にループを入力するようです。そして、それはいつもレジスタに入れておきましょうか?また、 'ldr r0、= Handle'をループから取り出すこともできます。 (ABIで 'svc#0'が戻り値以外のすべてのレジスタを保持することを確認しますが、ほとんどのプラットフォームはそのように動作します。) –

答えて

2

あなたのコードが完全に正しくありません、あなたはループの外ldr r0,=Handleを追加する必要があります(ピーターによって示唆される)、あなたは、オープンシステムコール(http://man7.org/linux/man-pages/man2/open.2.html)のパラメータを確認することもあります。これは実際の例です:

... 
@ Open an input file for reading 
ldr r0,=binaryfile  @ set Name for input file 
mov r1,#0 
ldr r2,=0666   @ permissions 
mov r7,#5 
swi 0 

@ Save the file handle in memory: 
ldr r1,=Handle  @ load input file handle 
str r0,[r1]    @ save the file handle 


loop: 
ldr r0,=Handle   @ load input file handle 
ldr r0,[r0] 
ldr r1,=readBuffer 
mov r2,#16 
mov r7, #3 
swi 0     @ read the integer into R0 
... 
+0

なぜ2番目の引数を変更したのかを説明するコメントを追加すると、おそらくO_RDONLYになります。私はUnixではハンドルではなく記述子と呼ばれているので、fdなどに 'Handle'の名前を変更しました。 –

+0

私はおそらく完全に静的ストレージを避けていたでしょう。 fdを押した後にスタック相対アドレスでリロードするか、システムコールが読み込みまたは破棄しないレジスタに値を保持するかのいずれかです。あるいは、少なくとも 'readBuffer'に相対的な変位でそれにアクセスするので、' ldr reg、= address'命令が1つだけ必要です。 asmの例での静的ストレージの過剰使用は、私のペットピーブです。しかし、このコメントはよりOPに向けられています。あなたは、あなたのコードをOPの頑丈な静的ストレージに可能な限り近づけておくだけです。 –

+0

ありがとうございます、それは動作します! – Livio

関連する問題