【问题标题】:How to create a function in assembly?如何在汇编中创建函数?
【发布时间】:2020-05-26 16:50:32
【问题描述】:

我需要创建一个计算矩形表面的简单函数(一个简单的 a*b 程序)。但是,在调用函数后,寄存器(包括 R0 和 R1)的值必须保持不变。 我的问题是我必须使用命令 POP 和 PUSH 吗?

start:
.include "m8def.inc"
.DEF var1= R16
.DEF var2= R17
.DEF surface= R18
.DEF temp= R19
rjmp main

surfacerectangle:
pop R20
pop R21
pop temp
add surface, var1
mul surface, var2
push temp
push R21
push R20
ret

main:

ldi temp, low(RAMEND) 
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp
ldi var1, 3
ldi var2, 4
ldi surface, 0
push temp

rcall surfacerectangle
pop temp

end3:
 nop

这是我编写的代码,但它似乎不起作用。有人在我的代码中看到问题吗? 这是用 Atmel Studio 7.0 为 ATmega8 微控制器编写的。

【问题讨论】:

  • “似乎不起作用”不是错误描述。请发布您的代码应该做什么,您期望什么结果以及您得到什么的描述。理想情况下,创建一个minimal reproducible example
  • 你怎么知道它不起作用?没有输出。此外,您的代码运行一次然后执行 NOP ......然后会发生什么?程序计数器不会以 NOP 指令停止。它一直在继续。这不是对微控制器进行编程的正确方法。

标签: assembly atmega atmelstudio


【解决方案1】:
start:
.DEF var1= R16
.DEF var2= R17
.DEF temp= R18
rjmp main

surfacerectangle:
mul var1, var2
ret

main:
ldi temp, low(RAMEND) 
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp
ldi var1, 3
ldi var2, 4

rcall surfacerectangle
end3:
 nop

发现问题,原来是错误使用POP和PUSH导致问题(问题是无限循环)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多