在nasm程序的移植过程中另一个要注意的问题是参数的传递,这在“nasm程序从32位到64位平台的移植(一)”有介绍,但是对于参数多于6个,需要用堆栈进行传递的情况,我想在这儿举个简单的例子。
假设有函数:
void foo(unsignedchar *pSrc1, unsigned char *pSrc2, unsignedchar *pDst1, unsigned char *pDst2, intStride1, int Stride2, int round1);
在32位平台上我们可能会这样获取参数
push edi
push esi
push ebp
push ebx
mov ecx, [esp + 16 + 4] ;pSrc1
mov ebx, [esp + 16 + 8] ;pSrc2
mov edx, [esp + 16 + 12] ;pDst1
mov ebp, [esp + 16 + 16] ;pDst2
mov esi, [esp + 16 + 20] ;Stride1
mov edi, [esp + 16 + 24] ;Stride2
mov eax, [esp + 16 + 28] ;round1
在64位平台上,按照unix ABI的规定参数是这样传递和获取的
;rdi ;pSrc1
;rsi ;pSrc2
;rdx ;pDst1
;rcx ;pDst2
;r8 ;Stride1
;r9 ;Stride2
mov rax, [rsp + 8] ;round1
超过6个的参数是通过堆栈传递,而且入栈顺序从右向左。
知道这些规则后,剩下的就是细心的替换了。