最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

assembly - Error assembling a rather simple a64 program - Stack Overflow

programmeradmin4浏览0评论

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
  • 1 Once you get this code to assemble, you're going to find several more bugs when you run it. Make sure you have a good setup with a debugger that will let you single step the instructions, inspect register and memory contents, etc. – Nate Eldredge Commented Mar 20 at 14:54
  • 1 This is crossposted from reddit. OP, do jot crosspost! You're just wasting people's time. – fuz Commented Mar 20 at 17:26
  • 2 For instance, do you realize that w0 and x0 are the same register? Specifically, w0 is the low 32 bits of x0. 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 to random (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:26
  • 3 Agree about crossposting. Pick one site to post on, and wait a reasonable amount of time (= days, not hours) for an answer. If you don't get one, or it's not satisfactory, then try another site. And if you get an answer later on one site, make sure to go back to the other and post the same info there, so that people don't waste time writing an answer to something that's already been answered elsewhere. – Nate Eldredge Commented Mar 20 at 17:29
  • 2 Also, the BSD-derived libc random 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. So ldr 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
 |  Show 1 more comment

1 Answer 1

Reset to default 2

The 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.

发布评论

评论列表(0)

  1. 暂无评论