2016-08-20 83 views
0

我想寫一個簡單的程序來打開一個二進制文件並讀取每個字節。我試圖做到這一點使用的Android設備使用此係統調用(https://android.googlesource.com/platform/bionic/+/cd58770/libc/SYSCALLS.TXT)與後續代碼用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 

但開放的系統調用後,手柄的值總是0xfffffffe

什麼建議嗎?

+0

在'strace'下運行您的程序,記錄它所做的所有系統調用。這是一種簡單的方法,可以在您傳遞錯誤參數的地方發現錯誤。順便說一下,失敗的系統調用總是返回'-ERRNO',所以你可以查看errno = -2的含義。也許EFAULT,ENOENT或其他。 (或者只是使用strace) –

+1

等一下,你在哪裏將'open(2)'返回值存儲到'Handle'中?它看起來像你在'r0'中進入循環。爲什麼不把它一直保存在註冊表中?你也可以把'ldr r0,= Handle'從循環中提出來。 (檢查ABI以確保'svc#0'持有除返回值以外的所有寄存器,但大多數平臺都以這種方式工作。) –

回答

2

您的代碼並不完全正確,您必須在循環中添加ldr r0,=Handle(如Peter所建議的),並且您還需要查看open系統調用(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

如果您添加註釋以解釋爲什麼您更改了第二個「arg」打開「從2到0.大概是O_RDONLY。我也會將'Handle'重命名爲fd或其他東西,因爲在Unix中它們被稱爲描述符,而不是句柄。 –

+0

我可能會完全避免靜態存儲;或者推動fd,然後用堆棧相對地址重新加載,或者將值保存在系統調用不讀取或銷燬的寄存器中。或者至少用相對於'readBuffer'的位移來訪問它,所以你只需要一個'ldr reg,= address'指令。在asm例子中過度使用靜態存儲是我的寵物。但是這個評論更多的是針對OP,你只是儘量保持你的代碼儘可能接近OP的笨重的靜態存儲。 –

+0

謝謝大家,它的工作! – Livio