高分请教安腾-IPF的几句汇编语言的意思?(在线等)

wbcuc 2010-09-13 07:59:10
遇到一点IA64的汇编,实在不懂,想 请教大家:
1. 汇编语言子函数的NESTED_SETUP (2,6,8,0)什么意思?
2. ld8都是存的是什么,[r8], 8的如何改变的?
3. save和restore是如何实现的?



//
// Note: use of NESTED_SETUP requires number of locals (l) >= 3
//
#define NESTED_SETUP(i, l, o, r) \
alloc loc1=ar##.##pfs,i,l,o,r ;\
mov loc0=b0
#define NESTED_RETURN mov b0 = loc0; \
\
mov ar##.##pfs = loc1;; \
br##.##ret##.##dpnt b0;;

// void AsmLLCALLEX (UINTN FunctionAddr, UINTN StackPointer)
PROCEDURE_ENTRY(AsmLLCALLEX)
NESTED_SETUP (2,6,8,0)

// NESTED_SETUP uses loc0 and loc1 for context save

//
// Save a copy of the VM stack pointer
//
mov r8 = in1;;

//
// Copy stack arguments from stack into registers.
// Assume worst case and copy 8.
//
ld8 out0 = [r8], 8;;
ld8 out1 = [r8], 8;;
ld8 out2 = [r8], 8;;
ld8 out3 = [r8], 8;;
ld8 out4 = [r8], 8;;
ld8 out5 = [r8], 8;;
ld8 out6 = [r8], 8;;
ld8 out7 = [r8], 8;;

//
// Save the original stack pointer
//
mov loc2 = r12;

//
// Save the gp
//
or loc3 = r1, r0

//
// Set the new aligned stack pointer. Reserve space for the required
// 16-bytes of scratch area as well.
//
add r12 = 48, in1

//
// Now call the function. Load up the function address from the descriptor
// pointed to by in0. Then get the gp from the descriptor at the following
// address in the descriptor.
//
ld8 r31 = [in0], 8;;
ld8 r30 = [in0];;
mov b1 = r31
mov r1 = r30
(p0) br.call.dptk.many b0 = b1;;

//
// Restore the original stack pointer and gp
//
mov r12 = loc2
or r1 = loc3, r0

//
// Now return
//
NESTED_RETURN

PROCEDURE_EXIT(AsmLLCALLEX)
...全文
109 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
PALadinWIC 2011-11-27
  • 打赏
  • 举报
回复
我的妈呀,这是去年的帖子啊
PALadinWIC 2011-11-26
  • 打赏
  • 举报
回复
/ Note: use of NESTED_SETUP requires number of locals (l) >= 3
//
#define NESTED_SETUP(i, l, o, r) \
alloc loc1=ar##.##pfs,i,l,o,r ;\
mov loc0=b0
#define NESTED_RETURN mov b0 = loc0; \
--------------------------------------------------

我来瞎讲两句吧,
安腾的汇编里,有存储器栈和寄存器栈两种,那个ALLOC指令就是分配寄存器栈的指令。
这条指令的详细信息如下:

将前一帧标记的值存入LOC1寄存器,然后将当前帧标记的值存入前一帧标记(备份当前栈的父栈、父栈的父栈的信息)
创建一个新的寄存器栈,NESTED_SETUP (2,6,8,0)当中的2、6、8、0分别代表一个寄存器栈的参数,其中i代表什么我忘记了,l代表栈的本地区,o代表栈的输出区,R代表栈的轮换数量。

如果把一个寄存器栈比作用来存储一个过程(函数)的话,那个本地区就是存储这个过程内部的局部变量的,O代表的就这个过程要调用其它过程,或返回父过程时要传入或传出的内容的,R代表寄存器轮换的数量,这方面概念太复杂,我也没搞清楚。

总之就记得这些啦,希望能你楼主以帮助。
wbcuc 2011-02-18
  • 打赏
  • 举报
回复
有没有人顶一下 帖子也没法结啊
fc_cpp 2011-02-18
  • 打赏
  • 举报
回复
跨年度帮顶!只看过8086的汇编语法,这些xx看不懂

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧