Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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
Linux 在arm部件中打印某些文本时出现分段错误_Linux_Assembly_Arm_Cross Compiling_Gnu - Fatal编程技术网

Linux 在arm部件中打印某些文本时出现分段错误

Linux 在arm部件中打印某些文本时出现分段错误,linux,assembly,arm,cross-compiling,gnu,Linux,Assembly,Arm,Cross Compiling,Gnu,我正在使用arm none linux gnueabi编译器 我的代码如下: .align 4 .code 32 .global _testfunc .func _testfunc: MOV R7, #4 MOV R0, #1 MOV R2, #12 LDR R1, =string SWI 0 .endfunc .data string:

我正在使用arm none linux gnueabi编译器

我的代码如下:

.align 4
.code 32           
.global _testfunc 
.func 
_testfunc:
          MOV R7, #4
          MOV R0, #1
          MOV R2, #12
          LDR R1, =string
          SWI 0
          .endfunc
.data
string:
        .ascii "Hello World\n"

.end
当我运行此程序时,它正在打印Hello World,但在这之后,它将显示分段错误


有没有其他方法可以不使用软件中断SWI进行打印

第一步始终是查看C程序的外观。使用参数-S保留汇编器。它会出现故障,因为您忘记通过返回调用方来结束函数。.endfunc不会这样做,您需要手动完成,通常使用bx lr。我使用c库printf,它工作了:`.align 4.code 32.global _testfunc.func _testfunc:LDR R0,=字符串stmfd sp!,{lr}bl printf ldmfd sp!,{lr}.endfunc bx lr.data string:.ascii Success\n.end如何使用printf以十六进制格式打印寄存器内容?您在评论中提出的问题与最初提出的有关segfault的问题不同。因此,它应该作为一个新问题发布,而不是评论或编辑。但我建议你先搜索一下。printf函数有很好的文档记录,无论您是用C还是汇编编码,格式字符串看起来都是一样的。您是直接运行_testfunc还是从C调用它?如果是后者,那么使用r7而不保留它,就违反了ABI调用约定——对于Thumb代码,由于覆盖了调用方的帧指针,因此几乎可以保证调用方存在segfault。