调整堆栈指针以推送函数参数
Adjust stack pointer for pushing arguements for functions
通常在我为 8051 芯片编写汇编时。我在调用函数之前使用寄存器R0-R7进行争论。
mov r6, #6
mov r7, #2
lcall setpos
我有兴趣使用堆栈来执行此操作(忽略这可能效率较低的事实)。在互联网上搜索我在这个 link
中找到了一个遮阳棚
我在回答中遗漏了一些东西。在回答中他做了以下事情
push #0
push #5
call function
pop r7 ; return value -> r7
...
function:
pop r7
pop r6 ; store return address
pop b ; 5 -> b
pop a ; 0 -> a
add a, b
push a ; store result in a and push it
push r6
push r7
ret
我认为每个寄存器都可以修改,包括堆栈指针,所以可以
push #4
push #8
call function
pop r7 ; result -> r7
...
function:
dec SP ; leave return address untouched
dec SP
pop r4 ; 8 -> A
pop r5 ; 4 -> B
add A, B
inc SP
push A; push result
ret
相反?我做得对吗?
你的想法还不错,因为它不需要寄存器来缓冲 return 地址,使用更少的时钟周期,并且使用更少的代码 space.
只有一个问题需要注意: 因为 return 地址在堆栈中保持其位置,所以所有 space 参数都是正在使用。在呼叫站点,您必须 POP <any>
或 DEC SP
与呼叫前推送的数量相同。
所以你的例子应该是:
push #4
push #8
call function
pop r7 ; result -> r7
dec sp
被调用的函数在returning:
之前不能改变SP
function:
dec SP ; leave return address untouched
dec SP
pop r4 ; 8 -> A
pop r5 ; 4 -> B
add A, B
inc SP
push A; push result
inc SP
inc SP
ret
补充说明:PUSH
和POP
只取内部RAM(00H到7FH)和特殊功能寄存器(80H到0FFH)的地址) 作为参数。立即值没有变体。即使你写 PUSH R2
也使用当前寄存器组中 R2 的绝对地址。
通常在我为 8051 芯片编写汇编时。我在调用函数之前使用寄存器R0-R7进行争论。
mov r6, #6
mov r7, #2
lcall setpos
我有兴趣使用堆栈来执行此操作(忽略这可能效率较低的事实)。在互联网上搜索我在这个 link
中找到了一个遮阳棚我在回答中遗漏了一些东西。在回答中他做了以下事情
push #0
push #5
call function
pop r7 ; return value -> r7
...
function:
pop r7
pop r6 ; store return address
pop b ; 5 -> b
pop a ; 0 -> a
add a, b
push a ; store result in a and push it
push r6
push r7
ret
我认为每个寄存器都可以修改,包括堆栈指针,所以可以
push #4
push #8
call function
pop r7 ; result -> r7
...
function:
dec SP ; leave return address untouched
dec SP
pop r4 ; 8 -> A
pop r5 ; 4 -> B
add A, B
inc SP
push A; push result
ret
相反?我做得对吗?
你的想法还不错,因为它不需要寄存器来缓冲 return 地址,使用更少的时钟周期,并且使用更少的代码 space.
只有一个问题需要注意: 因为 return 地址在堆栈中保持其位置,所以所有 space 参数都是正在使用。在呼叫站点,您必须 POP <any>
或 DEC SP
与呼叫前推送的数量相同。
所以你的例子应该是:
push #4
push #8
call function
pop r7 ; result -> r7
dec sp
被调用的函数在returning:
之前不能改变SPfunction:
dec SP ; leave return address untouched
dec SP
pop r4 ; 8 -> A
pop r5 ; 4 -> B
add A, B
inc SP
push A; push result
inc SP
inc SP
ret
补充说明:PUSH
和POP
只取内部RAM(00H到7FH)和特殊功能寄存器(80H到0FFH)的地址) 作为参数。立即值没有变体。即使你写 PUSH R2
也使用当前寄存器组中 R2 的绝对地址。