Im trying to assemble a rather simple program in a64. This is my first time using a64, since I've been using a raspberry pi emulator for arm.
.text
.global draw_card
draw_card:
ldr x0, =deck_size // Loader deck size
ldr w0, [x0] // Laeser deck size
cbz w0, empty_deck // Hvis w0==0 returner 0
bl random // Kalder random funktionen for at faa et index
ldr x1, =deck
ldr w2, [x1, x0, LSL #2] // Loader kortet ved et random index som er i x0
// Bytter det sidste kort ind paa det trukne korts position
sub w0, w0, #1 // Decrementer deck size med 1
ldr w3, [x1, w0, LSL #2] // Loader det sidste kort
str w3, [x1, x0, LSL #2] // Placerer det trukne kort ind på trukket pladsen
str w0, [x0] // Gemmer den opdateret deck size
mov x0, w2 // Returnerer det truke i x0
ret
// Hvis deck_size er 0
empty_deck:
mov x0, #0 // Returnerer 0 hvis deck er empty
ret
Sorry for the danish notation :). In short, the program should draw a random card, and reduce deck size by 1 afterwards. The main code is written in c. When I try to assemble the code, I get the following error messages:
as draw_card.s -o draw_card.o 49s 09:26:06 draw_card.s:17:21: error: expected 'uxtw' or 'sxtw' with optional shift of #0 or #2 ldr w3, [x1, w0, LSL #2] // Loader det sidste kort ^ draw_card.s:21:12: error: expected compatible register or logical immediate mov x0, w2 // Returnerer det truke i x0
Any help would be greatly appreciated.
Im trying to assemble a rather simple program in a64. This is my first time using a64, since I've been using a raspberry pi emulator for arm.
.text
.global draw_card
draw_card:
ldr x0, =deck_size // Loader deck size
ldr w0, [x0] // Laeser deck size
cbz w0, empty_deck // Hvis w0==0 returner 0
bl random // Kalder random funktionen for at faa et index
ldr x1, =deck
ldr w2, [x1, x0, LSL #2] // Loader kortet ved et random index som er i x0
// Bytter det sidste kort ind paa det trukne korts position
sub w0, w0, #1 // Decrementer deck size med 1
ldr w3, [x1, w0, LSL #2] // Loader det sidste kort
str w3, [x1, x0, LSL #2] // Placerer det trukne kort ind på trukket pladsen
str w0, [x0] // Gemmer den opdateret deck size
mov x0, w2 // Returnerer det truke i x0
ret
// Hvis deck_size er 0
empty_deck:
mov x0, #0 // Returnerer 0 hvis deck er empty
ret
Sorry for the danish notation :). In short, the program should draw a random card, and reduce deck size by 1 afterwards. The main code is written in c. When I try to assemble the code, I get the following error messages:
as draw_card.s -o draw_card.o 49s 09:26:06 draw_card.s:17:21: error: expected 'uxtw' or 'sxtw' with optional shift of #0 or #2 ldr w3, [x1, w0, LSL #2] // Loader det sidste kort ^ draw_card.s:21:12: error: expected compatible register or logical immediate mov x0, w2 // Returnerer det truke i x0
Any help would be greatly appreciated.
Share Improve this question edited Mar 20 at 14:53 Nate Eldredge 59.4k6 gold badges71 silver badges113 bronze badges asked Mar 20 at 9:20 Mark NickelsenMark Nickelsen 11 6 | Show 1 more comment1 Answer
Reset to default 2The A64 ISA doesn't generally support arbitrary mixing between 32-bit and 64-bit register operands. Certain instructions do support it, but then you need to specify whether the 32-bit register is to be sign-extended (sxtw
) or zero-extended (uxtw
).
So assuming you want to zero-extend w0
, just do:
ldr w3, [x1, w0, uxtw #2]
and
uxtw x0, w2
If you want to sign-extend it instead, use sxtw
in place of uxtw
.
w0
andx0
are the same register? Specifically,w0
is the low 32 bits ofx0
. You appear to be trying to use them to hold two different values simultaneously. Also, you need to think about calling conventions, and which registers are overwritten by your call torandom
(including the link register), so that you plan to save those values on the stack or elsewhere to restore later. – Nate Eldredge Commented Mar 20 at 17:26random
function doesn't take an argument specifying the desired range of values; it always just returns a random value between 0 and 2^31 - 1. Soldr w2, [x1, x0, LSL #2]
will read way out of bounds with very high probability. You would need to do the arithmetic yourself to reduce it to the appropriate range. – Nate Eldredge Commented Mar 20 at 17:35