I have recently run the following commands to install qemu.
sudo apt-get install qemu-user
sudo mkdir -p /opt/arm/10
wget 'https://developer.arm.com/-/media/Files/downloads/gnu-a/10.2-2020.11/binrel/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf.tar.xz?revision=d0b90559-3960-4e4b-9297-7ddbc3e52783&la=en&hash=985078B758BC782BC338DB947347107FBCF8EF6B' -O gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf.tar.xz
sudo tar Jxf gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf.tar.xz -C /opt/arm/10
Now there are a no. of ARM files i would like to compile and execute on my linux subsystem. It would be great if someone could provide a walkthrough for this issue. I have included a no. of links below to some example files. I am looking for a general command that will successfully compile and run all these files. Just like in C where gcc -o test test.c
would compile and run any C file. I do not have a raspberry pi
Here r a few example ARM programs:
.global _start
_start:
MOV R1, #X
MOV R2, #Y
MOV R3, #Z
MUL R5, R1, R1
MUL R6, R2, R2
ADD R5, R6
MUL R6, R3, R3
CMP R5, R6
BEQ _same
MOV R4, #0
B _exit
_same:
MOV R4, #1
_exit:
MOV R0, R4
MOV R7, #1
SWI 0
.data
.global _start
_start:
LDR R1, =X
LDR R2, =Y
LDR R3, =T
LDR R4, [R1]
STR R4, [R3]
LDR R4, [R2]
STR R4, [R1]
LDR R4, [R3]
STR R4, [R2]
_exit:
MOV R0, #0
MOV R7, #1
SWI 0
.data
X: .word 0x16
Y: .word 0x21
T: .word 0x00
@ binary search for V in 25 element array.
@ returns index for V if V is in the array.
@ otherwise returns length of array (25).
.global _start
_start:
@ populate the array A
LDR R1,=A
MOV R2,#0x00
_populate_array:
CMP R2,#MAX @ i == 25
BEQ _search
STR R2,[R1]
ADD R1,#0x04
ADD R2,#0x1
B _populate_array
_search:
MOV R6, #4 @ R6 == 4
MOV R1, #0 @ R1 == left
MOV R2, #MAX @ R2 == right
SUB R2, #1 @ R2 = MAX-1
_loop:
CMP R1, R2 @ is left>right ?
BGT _fail
@ compute new middle position
ADD R3, R1, R2 @ R3 = left + right
LSR R3, R3, #1 @ middle = (left + right)/2
@ each integer element uses 4 bytes of memory
@ R7 is the memory address for the middle integer value in array A
MUL R7, R3, R6 @ R7 = middle * 4
@ obtain middle value at middle position
LDR R4, =A @ R4 == &A (load address of A's 1st byte)
ADD R4, R7 @ R4 == &A[m] (add offset of m to that address)
LDR R5, [R4] @ R5 == A[m] (get value in A at that address)
@ compare middle value to searched for value V
CMP R5, #V @ V==A[m]?
BEQ _exit @ we've found the value V
BGT _left @ is V somewhere in left half?
@ if not, V must be somewhere in right half if at all
MOV R1, R3 @ left = middle
ADD R1, #1 @ left = left + 1
B _loop
_left: @ A[m]<V (V would be somewhere in left half)
MOV R2, R3 @ right = middle;
SUB R2, #1 @ right = right - 1
B _loop
_fail:
MOV R3, #MAX
_exit:
MOV R0, R5
MOV R7, #1
SWI 0
.data
.equ MAX, 25
A: .rept MAX
.word 0
.endr
.equ V, 17
.global main
main:
@ Stack the return address (lr) in addition to a dummy register (ip) to
@ keep the stack 8-byte aligned.
push {ip, lr}
@ Load the argument and perform the call. This is like 'printf("...")' in C.
ldr r0, =message
bl printf
@ Exit from 'main'. This is like 'return 0' in C.
mov r0, #0 @ Return 0.
@ Pop the dummy ip to reverse our alignment fix, and pop the original lr
@ value directly into pc — the Program Counter — to return.
pop {ip, pc}
@ --------------------------------
@ Data for the printf calls. The GNU assembler's ".asciz" directive
@ automatically adds a NULL character termination.
message:
.asciz "Hello, world.\n"
@ Here's how we will use the ARM registers R1-R5:
@
@ R1 - address of the next word
@ R2 - the character counter
@ R3 - contents of the next word
@ R4 - next byte
@ R5 - byte count
.global _start
@ program starts here
_start:
LDR R1, =mystring
@ initialise the character count (R2) to be 0
MOV R2,#0
nextw:
@ load the address of the next word into R3
LDR R3,[R1]
@ add 4 to the byte count
MOV R5, #4
nextb:
@ load next byte from word into R4
MOV R4, R3
@ use bitmask to get next byte value
AND R4, #MASK
@ if byte in R4 is 0, then we've found the "end of string" value
CMP R4, #EOS
BEQ endl
@ otherwise, increment the character count by 1
ADD R2, #1
@ decrement bytes by 1
SUB R5, #1
@ while (bytes !=0) from the slide
CMP R5, #0
BEQ incr
@ shift the contents of the word 8 bits right
LSR R3, #8
B nextb
incr:
@ move to the next word address
ADD R1,#4
B nextw
endl:
@ end of string '0' value found, we're done.
@
@ return character count as exit value
MOV R0, R2
MOV R7, #1
SWI 0
.data
.equ MASK, 0x000000ff
.equ EOS, 0
mystring: .asciz "0123456789"
@ try other string examples
@ mystring: .asciz "thunderbirds"
Thx in advance!