当前位置: 首页 > 知识库问答 >
问题:

如何使用Raspberry PI的ARM程序集从C库调用putchar?

姬选
2023-03-14
    .text
   .balign 4
   .global main
   main:
       LDR r4, [r1, #4]    @ base address for argv[1] 
       MOV r5, #0          @ counter for loop

   loop:
       LDRB r0, [r4], #1   @ read each char byte in and increment
       CMP r0, #0          @ #0 representing null terminator
       BL putchar
       ADDNE r5, r5, #1
       BNE loop
   end:
       MOV r0, #0
       BX lr

任何帮助都将不胜感激!

共有1个答案

王经赋
2023-03-14

实际上,您的代码存在一些问题,它们都与调用边界上保留的内容和不保留的内容有关。

@jester的评论就您的直接问题而言非常准确:PSR(包含状态标志)没有在调用边界上保留,因此CMP的结果被BL所破坏。

但还值得注意的是,lr也被bl所取代,因此当您到达main()的结尾时,bx lr将直接分支回bl后面的行。您的注释表明您知道r0-r3被调用。但是r12lr也是,因此在使用时需要保留它们;而main()与其他函数一样是一个函数,因此它需要通过保留r4-r11来遵守调用约定。

当前,main()正在重击R4R5,因此需要在开始时将它们推送到堆栈中,并在结束时弹出它们,同时还需要将LR(以避免LRBL重击的问题)。ARM ABI需要在不同转换单元中跨越调用边界的8字节堆栈对齐,因此您还必须推入并弹出另一个寄存器,使其成为偶数。

所以,一开始,你要

main:
    PUSH {r4-r6,lr}

在最后

    POP {r4-r6,lr}
    BX lr

或等同地

    POP {r4-r6,pc}
 类似资料:
  • 我正在尝试编写一个小型生成事件实用程序来读取我的代码的当前程序集版本。 因此,我希望该可执行文件位于我的%path%(或至少某个中心位置)中,并且能够将目标程序集的相对路径作为参数(对assembly.LoadFile()它),但assembly.LoadFile()会抱怨接收到相对路径。 我该如何做: C:\calling\path>mytool rel\path\target.exe 而不必每

  • 问题内容: 我猜想有没有一种方法可以使用C#从IronPython调用Python代码?如果是这样,怎么办? 问题答案: 该过程非常简单,尤其是在C#/。NET 4应用程序中,该应用程序通过使用该类型改进了对动态语言的支持。但这最终取决于您打算如何在应用程序中使用(Iron)Python代码。您始终可以作为一个单独的进程运行,并传入您的源文件,以便可以执行它们。但是您可能想将它们 托管 在C#应用

  • 我需要调用微软图形API在Azure广告中创建用户。 首先,我需要测试从控制台应用程序,然后需要实现在Azure函数。 https://developer.microsoft.com/en-us/graph/graph-explorer

  • 问题内容: 我有一个用c#创建的dll,在调用时会执行一些数据库操作。我必须将一些参数从Java应用程序传递到dll中的方法。关于如何执行此操作的任何想法。 要么 通过Java应用程序在c#中调用方法的更好的主意吗? 谢谢 编辑:我的Java应用程序是AVAYA平台的标准Dialogue Designer应用程序,并且我已经开发了一个仅在.net SDK上工作的C#应用​​程序。所以我需要将数据从

  • 我在visual studio中创建了一个dll(我没有使用任何win\u API函数)。我想从我生成的android.apk文件中调用这个dlll,但在运行这个文件时,我遇到了这个错误。 "java.lang.无法从加载器加载Testdll1dalvik.system.PathClassLoader[DexPathList[[zip file"/data/app/], nativeLibrary

  • 问题内容: 我需要从PowerShell调用Java程序(jar文件)。以下代码有效: 但是我需要在一个过程中运行该应用程序(使用)。 我正在尝试以下成功: 错误: 知道如何解决吗? 问题答案: 您将需要为Powershell使用以下格式: 或者您可以使用的其他选项是Start-job: