Assembly 如何使用arm汇编读取.txt文件
我刚刚开始学习arm汇编代码,基本示例很少。我需要一些关于如何使用汇编代码(ARM)读取.txt文件的帮助。我试过nasm,它运行良好。但我的要求是运行arm代码(在Linux上),我不熟悉其语法。根据在线博客尝试了多种方法,但没有一种方法适用于我的案例 以下是有效的nasm代码:Assembly 如何使用arm汇编读取.txt文件,assembly,arm,nasm,Assembly,Arm,Nasm,我刚刚开始学习arm汇编代码,基本示例很少。我需要一些关于如何使用汇编代码(ARM)读取.txt文件的帮助。我试过nasm,它运行良好。但我的要求是运行arm代码(在Linux上),我不熟悉其语法。根据在线博客尝试了多种方法,但没有一种方法适用于我的案例 以下是有效的nasm代码: [SECTION .text] global _start _start: xor eax, eax xor ebx, ebx xor ecx, ecx x
[SECTION .text]
global _start
_start:
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
jmp stub
openf:
pop ebx
mov al, byte 5 ; syscall 5, open
xor ecx, ecx
int 0x80
mov esi, eax
jmp readloop
readloop:
mov ebx, esi
mov al, byte 3 ; syscall 3, read
sub esp, 1 ; reserve memory on stack for read byte
lea ecx, [esp] ; load effective address of that memory
mov dl, byte 1 ; read count, 1 byte
int 0x80 ; call read
xor ebx, ebx
cmp ebx, eax
je exit
mov al, 4 ; syscall 4, write
mov bl, 1 ; file descriptor 1, stdout
mov dl, 1 ; write count, 1 byte
int 0x80 ; call write (4)
add esp, 1
jmp readloop
exit:
mov al, byte 1
xor ebx, ebx
int 0x80 ; call exit (1)
stub:
call openf
db 'flag.txt'
简而言之,我的任务是使用arm汇编源代码读取“flag”文件,其内容就是我任务的解决方案。非常感谢您的帮助,因为这将帮助我更快地学习汇编代码
更新:
我尝试使用SWI,下面是阅读和打印的代码:
@@@ OPEN INPUT FILE, READ INTEGER FROM FILE, PRINT IT, CLOSE INPUT FILE
.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 Stdout, 1 @ Set output target to be Stdout
.equ SWI_Exit, 0x11 @ Stop execution
.global _start
.text
_start:
@ print an initial message to the screen
mov R0,#Stdout @print an initial message
ldr R1, =Message1 @ load address of Message1 label
swi SWI_PrStr @ display message to Stdout
@ == Open an input file for reading =============================
@ if problems, print message to Stdout and exit
ldr r0,=InFileName @ set Name for input file
mov r1,#0 @ mode is input
swi SWI_Open @ open file for input
@ Save the file handle in memory:
ldr r1,=InFileHandle @ if OK, load input file handle
str r0,[r1] @ save the file handle
@ == Read integers until end of file =============================
RLoop:
ldr r0,=InFileHandle @ load input file handle
ldr r0,[r0]
swi SWI_RdInt @ read the integer into R0
bcs EofReached @ Check Carry-Bit (C): if= 1 then EOF reached
@ print the integer to Stdout
mov r1,r0 @ R1 = integer to print
mov R0,#Stdout @ target is Stdout
swi SWI_PrInt
mov R0,#Stdout @ print new line
ldr r1, =NL
swi SWI_PrStr
bal RLoop @ keep reading till end of file
@ == End of file ===============================================
EofReached:
mov R0, #Stdout @ print last message
ldr R1, =EndOfFileMsg
swi SWI_PrStr
.data
.align
InFileHandle: .skip 4
InFileName: .asciz "newlog.txt"
FileOpenInpErrMsg: .asciz "Failed to open input file \n"
EndOfFileMsg: .asciz "End of file reached\n"
ColonSpace: .asciz": "
NL: .asciz "\n " @ new line
Message1: .asciz "Hello World! \n"
当我运行此操作时,我得到以下错误:
$ qemu-arm myshell
qemu: unhandled CPU exception 0x2 - aborting
R00=00000001 R01=00010126 R02=00000000 R03=00000000
R04=00000000 R05=00000000 R06=00000000 R07=00000000
R08=00000000 R09=00000000 R10=000100e0 R11=00000000
R12=00000000 R13=f6fff9b0 R14=00000000 R15=00008080
PSR=00000010 ---- A usr32
qemu: uncaught target signal 6 (Aborted) - core dumped
Aborted
首先,您需要学习手臂部件的基础知识。例如,命令是什么,寄存器是什么,等等。问题中的示例适用于Intel x86 CPU。ARM是一种不同的体系结构,所以区别不在于语法;命令、寄存器,甚至一些一般的想法都不是英特尔的。例如,在ARM上,大多数算术命令使用三个寄存器,而不像Intel上的两个(
a:=b+c
而不是a:=a+b
)。另一方面,ARM不支持内存位置上的算术运算——您必须先加载到寄存器中
无论如何,像这样的StackOverflow答案不适用于ARM简介。仔细阅读。学习策略取决于您是否熟悉任何程序集(如英特尔x86),以及您是否熟悉一般编程。低级编程是一种完全不同的野兽;如果您只知道C或Python,那么必须进行一些主要的心智模型调整。如果您知道x86程序集,您应该从一个
如果您是一般编程新手,请停止混淆视听,先学习高级语言。我是认真的
综上所述,当涉及到文件读取时,Linux系统称之为。ARM约定是:syscall#进入R7,参数进入R0..R5。您需要系统调用2(打开)、0(读取)、3(关闭)。执行系统调用的命令是
swi
(在旧的汇编程序中),svc#0
(如果在Thumb-2模式下以ARMv7+为目标,并且汇编程序支持它)
希望这有帮助
编辑:看起来像问题的最新编辑中的系统调用序列,即
.equ SWI_PrStr, 0x69 @ Write a null-ending string
...
swi SWI_PrStr @ display message to Stdout
来自特定于ARM的系统调用规范,它与Linux/ARM系统调用接口无关,只是它们都是系统调用。有一个支持它们的第一方ARM模拟器,但OP并没有针对它。ARM是一个完全不同的cpu体系结构。要么找人帮你翻译,要么学习手臂装配。是的,我完全同意你的观点。我不想翻译上面的nasm代码,相反,如果有人能告诉我如何使用arm汇编代码读取和打印文件,那会有帮助。信息不够。具体来说,您的ARM环境是什么?是Linux吗?网间网操作系统?安卓文件读取不是一个纯粹的汇编操作,它需要操作系统(即系统调用和/或RTL)的合作,社区需要知道它是哪个操作系统。很抱歉,错过了。需要在Linux上运行的ARM中编写代码。感谢Seva的回答。我已经在研究高级语言node.js、python等,但我第一次要讨论arm汇编,这就是为什么在学习中会遇到一些问题。作为您的输入,我根据您的评论尝试使用SWI,并用上面的代码更新了我的问题。遇到一些错误,请你看一下好吗?或者请为您建议的伪代码提供一个代码片段,因为这对我来说有点陌生。我没有qemu arm,也无法测试,但我的消息来源声称Linux/arm上的syscall约定是不同的。阅读我的最后一段-r7到syscall(1代表write),SWI#0。试着用“打印字符串”一段。