assembly 在ARMv6汇编中,一个代码不工作,但修改后的版本工作,为什么?

ejk8hzay  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(120)

我有一个程序在armv6汇编这计算这结果(x +y)^2
这段代码不起作用,并返回:“不支持的ARM系统调用:0xffffdf”

.global _start
.text
_start:
    MOV r0, #4
    MOV r1, #5
    MOV r7, #1
    BL calc
    SWI #0

calc:
    ADD r7, r0, r1
    MUL R0, R7, R7
    MOV PC, LR

但这一个是稍微编辑和工程(或它没有?):

.global _start
.text
_start:
   MOV r0, #4
   MOV r1, #5
   MOV r7, #1
   BL calc
   BL exit

calc:
   ADD r7, r0, r1
   MUL R0, R7, R7
   MOV PC, LR

exit:
   LDR r7, =1
   SWI 0

有没有人能告诉我为什么第一个代码不起作用?第二个甚至有效吗?

pprl5pva

pprl5pva1#

第一组r0r1

MOV r0, #4
 MOV r1, #5

此处设置r7无效:

MOV r7, #1

呼叫calc

BL calc

calc:
 ADD r7, r0, r1
 MUL R0, R7, R7
 MOV PC, LR

r7现在是4 + 5 = 9。
调用系统调用编号9,即link

SWI 0

link需要2个参数,这些参数是指向字符串的指针,由于81和5都不是有效指针,因此返回错误-EFAULT = -14 in r0

calc:
 ADD r7, r0, r1
 MUL R0, R7, R7
 MOV PC, LR

现在的计算公式为-14 +5 = -9 =。
调用不存在的系统调用号0xfffffff7

SWI 0

r0中返回错误-ENOSYS = -38。

calc:
 ADD r7, r0, r1
 MUL R0, R7, R7
 MOV PC, LR

现在的值为-38 +5 = -33 =。
调用不存在的系统调用号0xffffffdf

SWI 0

这种情况会无限重复。
正确的程序在SWI 0之前将r7设置为1,因此执行exit系统调用。

相关问题