Assembly 当我尝试在Armv8程序集中分配数组时,执行冻结

Assembly 当我尝试在Armv8程序集中分配数组时,执行冻结,assembly,arm,armv8,Assembly,Arm,Armv8,所以我在assemply中编程,这只是一个简单的代码,所以我可以学习如何分配数组,以便稍后在NEON编程中使用它们 ASM_FUNC(FPE) .data .balign 8 array: .skip 80 array1: .word 10,20,30,40 .text ldr x0,=array mov x1,#10 check: cmp x1,#1 bne loop b exit loop: str x1,[x0],#8 //St

所以我在assemply中编程,这只是一个简单的代码,所以我可以学习如何分配数组,以便稍后在NEON编程中使用它们

ASM_FUNC(FPE)
.data
.balign 8

array: .skip 80 
array1: .word 10,20,30,40

.text

ldr x0,=array
mov x1,#10

check: 
      cmp x1,#1
      bne loop
      b exit

loop:
      str x1,[x0],#8 //Stores the value in x1 into x0 and moves the address +8 bytes
      sub x1,x1,#1   //x1--
      b check


exit:
      mov x0,#11
          ret
因此,对某些部分进行了注释,以便我可以尝试查找代码的中断位置(我的系统上没有调试)。
我开始评论计算部分,并在ret之前添加了一个mov x0,#11,看看问题是否出在计算上。原来不是。 当我取消对数组的注释:.skip 80和ldr x0,=array时,如果没有响应,我的应用程序将只停留在那里

谁能告诉我我做错了什么? 我在armv8总成上使用A64

从该c程序调用入口点:

void  PocAsm_EntryPoint ( )
    {
    
    
          Print(L"========== ASM ==========\n");
       
        
          UINT32 fff = FPE();
          Print(L" %d \n",fff);
        
          Print(L"=========== ASM ===========\n");
        
          Print(L"Test version 0.24 \n");
      return 0;
    }

不幸的是,我没有找到打印的定义,因此我很抱歉,这是试图回答以下问题:
FPE()
函数是否按照预期工作,同时使用标准工具(如
qemu-system-aarch64
GDB
)从等式中删除所有其他内容

FPE()
函数的代码将为Cortex-A53 qemu virt机器编译

先决条件:

  • qemu-system-aarch64已安装:
Ubuntu 20.04
sudo-apt-get-install-qemu-system-arm

Windows 10:从下载并安装
qemu-w64-setup-20201120.exe安装程序

  • 已安装
    Cortex-A
    aarch64无elf
    工具链。可从以下网址下载。Linux和Windows 10都有相应的版本
FPE.s

        .arch armv8-a
        .file   "FPE.s"

        .data
        .balign 8
        .globl array
array:  .skip 80 
array1: .word 10,20,30,40

        .text
        .align  2
        .globl FPE
FPE:
        ldr x0,=array
        mov x1,#10

check: 
        cmp x1,#1
        bne loop
        b exit

loop:
        str x1,[x0],#8  //Stores the value in x1 into x0 and moves the address +8 bits
        sub x1,x1,#1    //x1--
        b check

exit:
        mov x0,#11
        ret
        .end
                .title startup64.s
                .arch armv8-a
                .text
                .section .text.startup,"ax"    
                .globl _start
_start:
                ldr x0, =__StackTop
                mov sp, x0
                bl FPE
wait:           wfe
                b wait
               .end
startup.s

        .arch armv8-a
        .file   "FPE.s"

        .data
        .balign 8
        .globl array
array:  .skip 80 
array1: .word 10,20,30,40

        .text
        .align  2
        .globl FPE
FPE:
        ldr x0,=array
        mov x1,#10

check: 
        cmp x1,#1
        bne loop
        b exit

loop:
        str x1,[x0],#8  //Stores the value in x1 into x0 and moves the address +8 bits
        sub x1,x1,#1    //x1--
        b check

exit:
        mov x0,#11
        ret
        .end
                .title startup64.s
                .arch armv8-a
                .text
                .section .text.startup,"ax"    
                .globl _start
_start:
                ldr x0, =__StackTop
                mov sp, x0
                bl FPE
wait:           wfe
                b wait
               .end
建筑:

我们将为qemu virt机器构建
FPE.elf
(RAM从
0x40000000
开始):

调试:

在shell中启动qemu:

/opt/qemu-5.1.0/bin/qemu-system-aarch64  -semihosting -m 1M -nographic -serial telnet::4444,server,nowait -machine virt,gic-version=2,secure=on,virtualization=on -S -gdb tcp::1234,ipv4 -cpu cortex-a53 -kernel FPE.elf
启动GDB

opt/arm/9/gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gdb  --quiet -nx -ex 'target remote localhost:1234' -ex 'load' --ex 'b _start' -ex 'b exit' FPE.elf
GDB
应启动:

Reading symbols from FPE.elf...
Remote debugging using localhost:1234
_start () at startup.s:7
7                       ldr x0, =__StackTop
Loading section .text, size 0x50 lma 0x40000000
Loading section .data, size 0x60 lma 0x40010050
Start address 0x40000000, load size 176
Transfer rate: 85 KB/sec, 88 bytes/write.
Breakpoint 1 at 0x40000000: file startup.s, line 7.
Breakpoint 2 at 0x40000040: file FPE.s, line 28.
从这一点开始,可以使用命令
stepi
p/x$x0
x/10g 0x40010050
来监视程序行为,直到它到达
退出
标签

在这里,我们将在开始和退出断点处显示数组中的10个元素:

gdb) x/10g 0x40010050
0x40010050:     0       0
0x40010060:     0       0
0x40010070:     0       0
0x40010080:     0       0
0x40010090:     0       0
(gdb) continue
Continuing.

Breakpoint 2, exit () at FPE.s:28
28              mov x0,#11
(gdb) x/10g 0x40010050
0x40010050:     10      9
0x40010060:     8       7
0x40010070:     6       5
0x40010080:     4       3
0x40010090:     2       0
从这一点开始单步执行表示程序从执行中正确返回:

(gdb) stepi
29              ret
(gdb) stepi
wait () at startup.s:10
10      wait:           wfe
(gdb) stepi
11                      b wait
(gdb) stepi
10      wait:           wfe
因此,问题的答案是:是的,
FPE()
函数的代码工作正常

同样的过程可以在Windows 10上运行,这只是调整用于运行
aarch64 none-elf-gcc
qemu-system-aarch64
GDB
的三个命令的问题


将目标文件的转储与我测试的转储进行比较可能有助于了解问题:

/opt.arm/9/gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin/aarch64-none-elf-as -o FPE.o FPE.s
/opt/arm/9/gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin/aarch64-none-elf-objdump -D FPE.o 

FPE.o:     file format elf64-littleaarch64


Disassembly of section .text:

0000000000000000 <FPE>:
   0:   58000140        ldr     x0, 28 <exit+0x8>
   4:   d2800141        mov     x1, #0xa                        // #10

0000000000000008 <check>:
   8:   f100043f        cmp     x1, #0x1
   c:   54000041        b.ne    14 <loop>  // b.any
  10:   14000004        b       20 <exit>

0000000000000014 <loop>:
  14:   f8008401        str     x1, [x0], #8
  18:   d1000421        sub     x1, x1, #0x1
  1c:   17fffffb        b       8 <check>

0000000000000020 <exit>:
  20:   d2800160        mov     x0, #0xb                        // #11
  24:   d65f03c0        ret
        ...

Disassembly of section .data:

0000000000000000 <array>:
        ...

0000000000000050 <array1>:
  50:   0000000a        .inst   0x0000000a ; undefined
  54:   00000014        .inst   0x00000014 ; undefined
  58:   0000001e        .inst   0x0000001e ; undefined
  5c:   00000028        .inst   0x00000028 ; undefined
/opt.arm/9/gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin/aarch64-none-elf-as-o FPE.o FPE.s
/opt/arm/9/gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin/aarch64-none-elf-objdump-D FPE.o
o:文件格式elf64-LittleArch64
第节的分解。正文:
0000000000000000 :
0:58000140 ldr x0,28
4:d2800141 mov x1,#0xa/#10
0000000000000008 :
8:f100043f cmp x1,#0x1
c:54000041北东14//b.任何
10:1400004 b 20
0000000000000014 :
14:f8008401 str x1[x0],#8
18:d1000421子x1,x1,#0x1
1c:17FFFB b 8
0000000000000020 :
20:d2800160 mov x0,#0xb/#11
24:d65f03c0 ret
...
分解截面。数据:
0000000000000000 :
...
0000000000000050 :
50:0000000a.指令0x0000000a;未定义
54:00000014.指令0x00000014;未定义
58:0000001e指令0x0000001e;未定义
5c:00000028.指令0x00000028;未定义
转储最小示例的完整ELF文件将给出:

opt/arm/9/gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin/aarch64-none-elf-objdump -D FPE.elf

FPE.elf:     file format elf64-littleaarch64


Disassembly of section .text:

0000000040000000 <_start>:
    40000000:   580000c0        ldr     x0, 40000018 <wait+0xc>
    40000004:   9100001f        mov     sp, x0
    40000008:   94000006        bl      40000020 <FPE>

000000004000000c <wait>:
    4000000c:   d503205f        wfe
    40000010:   17ffffff        b       4000000c <wait>
    40000014:   00000000        .inst   0x00000000 ; undefined
    40000018:   40010000        .inst   0x40010000 ; undefined
    4000001c:   00000000        .inst   0x00000000 ; undefined

0000000040000020 <FPE>:
    40000020:   58000140        ldr     x0, 40000048 <exit+0x8>
    40000024:   d2800141        mov     x1, #0xa                        // #10

0000000040000028 <check>:
    40000028:   f100043f        cmp     x1, #0x1
    4000002c:   54000041        b.ne    40000034 <loop>  // b.any
    40000030:   14000004        b       40000040 <exit>

0000000040000034 <loop>:
    40000034:   f8008401        str     x1, [x0], #8
    40000038:   d1000421        sub     x1, x1, #0x1
    4000003c:   17fffffb        b       40000028 <check>

0000000040000040 <exit>:
    40000040:   d2800160        mov     x0, #0xb                        // #11
    40000044:   d65f03c0        ret
    40000048:   40010050        .inst   0x40010050 ; undefined
    4000004c:   00000000        .inst   0x00000000 ; undefined

Disassembly of section .data:

0000000040010050 <__data_start>:
        ...

00000000400100a0 <array1>:
    400100a0:   0000000a        .inst   0x0000000a ; undefined
    400100a4:   00000014        .inst   0x00000014 ; undefined
    400100a8:   0000001e        .inst   0x0000001e ; undefined
    400100ac:   00000028        .inst   0x00000028 ; undefined
opt/arm/9/gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin/aarch64-none-elf-objdump-D FPE.elf
FPE.elf:文件格式elf64-LittleArch64
第节的分解。正文:
0000000040000000 :
40000000:580000c0 ldr x0,40000018
40000004:9100001f mov sp,x0
40000008:94000006 bl 40000020
00000000 4000000C:
4000000c:d503205f wfe
40000010:17ffffff b 4000000c
40000014:00000000。指令0x00000000;未定义
40000018:40010000。仪器0x40010000;未定义
4000001c:00000000。仪器0x00000000;未定义
0000000040000020 :
40000020:58000140 ldr x0,40000048
40000024:d2800141 mov x1,#0xa/#10
0000000040000028 :
40000028:f100043f cmp x1,#0x1
4000002c:54000041 b.ne 40000034//b.any
40000030:1400004 b 40000040
0000000040000034 :
40000034:f8008401 str x1[x0],#8
40000038:d1000421子x1,x1,#0x1
4000003c:17fffffb b 40000028
0000000040000040 :
40000040:d2800160 mov x0,#0xb/#11
40000044:d65f03c0 ret
40000048:40010050。仪器0x40010050;未定义
4000004c:00000000。仪器0x00000000;未定义
分解截面。数据:
0000000040010050 :
...
00000000 400100A0:
400100a0:0000000a.仪器0x0000000a;未定义
400100a4:00000014.指令0x00000014;未定义
400100a8:0000001e仪器0x0000001e;未定义
400100ac:00000028。仪器0x00000028;未定义

您在一台64位计算机上,64位值是8字节,而不是4字节。如果要存储32位值,则应存储
w1
,而不是
x1
。此外,代码需要一个入口点。你是如何装配和安装的