我正在搞乱我的新树莓派,我对装配很新。我已经搜索了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程序集程序并仅与as
和ld
成功关联
答案 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'。因此,这是一个仅使用syscall
和as
编译的工作,退出和后续的arm程序...
ld
有关系统调用的有用信息,请参阅
答案 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
视频:
答案 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