Raspberry Pi 3 Model B ARM组装非法指令(核心转储)

时间:2018-02-22 01:16:43

标签: assembly raspberry-pi arm raspberry-pi3 archlinux-arm

我正在搞乱我的新树莓派,我对装配很新。我已经搜索了Google和SO以获得解决方案,这是我最接近正在运行的程序。

main.s(评论来自我在互联网上找到的解释)

.section .text
.global _start

_start:
    mov x0, #0 // return value 0 for success
    mov x7, #1 // 1 is exit in the vector table
    svc 0      // execute the system call to exit the program

然后我与as main.s -o main.o汇总并与ld main.o -o main相关联。运行./main输出“非法指令(核心转储)”。

这是一个在64位四核ARM Cortex-A53上运行ARM Arch Linux的Raspberry Pi Model B.

目标:编译ARM程序集程序并仅与asld成功关联

3 个答案:

答案 0 :(得分:1)

public abstract class SQLiteTestBase { public static ConnectionContext Connection { get; set; } public static FooDatabase Database { get; set; } [TestMethod] public void DoSomeFooTest() { Database.DoFoo(); } } [TestClass] public class SQLiteTest : SQLiteTestBase { [ClassInitialize] public static void ClassInit(TestContext context) { Database = new FooDatabase(); Database.GetContext = () => Connection; Connection = new ConnectionContext(Database.GetConnection(), false); } [TestInitialize] public void TestInit() { Connection = new ConnectionContext(Database.GetConnection(), false); Database.Initialize(); } [TestCleanup] public void TestCleanup() { Connection.Dispose(); Connection = null; } } 的手册页中,它指出arm64体系结构调用syscalls的约定是:“argument:x8”和“instruction:svc#0”。在this github project上,'exit'的syscall参数定义为'93'。因此,这是一个仅使用syscallas编译的工作,退出和后续的arm程序...

ld
有关系统调用的有用信息,请参阅

Another answer

答案 1 :(得分:0)

您正在将值0移动到内存地址0.您不能只写入任意内存位置。该程序失败,因为它试图写入它不拥有的内存区域。请尝试将其移至有效的寄存器。

还有很多很好的教程:

https://azeria-labs.com/writing-arm-assembly-part-1/

http://www.peter-cockerell.net/aalp/html/frames.html

https://www.coranac.com/tonc/text/asm.htm

视频:

https://www.youtube.com/watch?v=Sm6v9UyhCkA

答案 2 :(得分:0)

.section .text
.global _start

_start:
    //mov r0, #0 // ARM 32-bit version
    mov x0, #0   // ARM 64-bit version
    //mov r7, #1 // ARM 32-bit version of this (Raspbian)
    mov x8, #93  // ARM 64-bit version of this (Ubuntu 64-bit, Arch64)
    svc 0        // execute the system call to exit the program