Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 使用QEMU和ARM半托管获取输入?_Assembly_Arm_Qemu - Fatal编程技术网

Assembly 使用QEMU和ARM半托管获取输入?

Assembly 使用QEMU和ARM半托管获取输入?,assembly,arm,qemu,Assembly,Arm,Qemu,对于ARM体系结构,我们使用SVC指令进行系统调用。我的参考资料如下。 特别是,选择任意版本,选择Arm编译器工具链开发软件…,然后选择半托管,以查看可用的系统调用号 需要定义一个getChar()例程,将char留在寄存器r0中。根据文档,调用时,r1必须为0,退出后,r0包含读取字符。因此有人认为 mov r1,#0 mov r0,#7 svc 123456 应该是必不可少的成分。但是,程序不会等待输入。我还可以肯定地说,寄存器r0在退出后总是包含值0。有什么想法吗?我怀疑问题在于理解文档

对于ARM体系结构,我们使用
SVC
指令进行系统调用。我的参考资料如下。 特别是,选择任意版本,选择Arm编译器工具链开发软件…,然后选择半托管,以查看可用的系统调用号

需要定义一个
getChar()
例程,将
char
留在寄存器
r0
中。根据文档,调用时,
r1
必须为0,退出后,
r0
包含读取字符。因此有人认为

mov r1,#0
mov r0,#7
svc 123456

应该是必不可少的成分。但是,程序不会等待输入。我还可以肯定地说,寄存器
r0
在退出后总是包含值0。有什么想法吗?我怀疑问题在于理解文档中console的含义。

来自qemu 1.4.0源代码:(文件
target arm/arm semi.c
,第303-305行)


如果您真的想使用qemu的半托管模式并从“控制台”读取,我建议您使用缓冲区大小为1的SYS_READ。

您在什么平台上?我在linux x86_64上。然而,我正在通过半托管接口在QEMU中模拟ARM。半宿主接口在post中的链接上实现系统调用。我感兴趣的是“SYS_READC”——如果在r1中用0调用它,它应该在r0中返回一个字符。它是0x07。您可以通过SVC命令调用它,该命令允许主机系统执行该操作。swi基础设施需要大量开销,而且显然是特定于平台的。如果你想读输入,为什么不直接读呢?尽管存在ARMs错觉,但swi、svc、angel、semihosting,不管他们今天怎么称呼它,都不是一条可行之路,除非你自己实现系统(你提供了双方),即使在那里,考虑到开销,使用基础设施也没有多大意义。这是一种摆脱用户模式的方法当然,如果你有一个需要用户模式的系统…谢谢你的评论。你能推荐一种直接获取输入的标准方法吗?我的目标是让编译器以ARM体系结构为目标,我想用QEMU测试它——因为这似乎是最简单的方法。ARM体系结构与之无关,它依赖于平台,可以使用swi/svc作为抽象层,但必须有人实现依赖于平台的下半部分。arm平台差异巨大,因此首先您可能需要选择一类平台,微控制器vs linux功能vs手机、平板电脑等。即使使用angel或semihosting或其他他们称之为的工具,现在您仍然需要一个特定于平台的层。
case TARGET_SYS_READC:
   /* XXX: Read from debug console. Not implemented.  */
    return 0;