我指的是NASM。 有一些标准寄存器,我们在调用内核之前加载指令。
我想知道在某些时候我们是否想要加载比可用寄存器数量更多的指令,那么我们该怎么做..... ???
新手装配。请帮助..
答案 0 :(得分:1)
有六个寄存器存储所使用的系统调用的参数。这些是EBX,ECX,EDX,ESI, EDI和EBP。这些寄存器采用连续的参数,从EBX寄存器开始。如果有更多 如果超过六个参数,则第一个参数的存储单元存储在EBX寄存器中。
在书中找到它!! !!
答案 1 :(得分:0)
实际上,对于32位系统调用,如果参数多于我们的寄存器(早于IME),我们将参数放在一个结构中并指向ebx
或ecx
它(sys_socketcall
,例如)。我是64位的新手,但我想rdi
...我认为这就是你所要求的。有一个具体的例子吗?
答案 2 :(得分:0)
一些(大多数?)系统使用堆栈来传递超出寄存器可以处理的参数(或指向参数的指针)。
答案 3 :(得分:0)
我认为每个系统都有一个堆栈,您可以使用它。
考虑以下场景,你已经在eax和ebx寄存器中有一些数据,但也想使用sys_write,那么你可以使用堆栈。
检查以下代码片段,演示相同内容。 : -
print:
; you want to preserve the value stored in the eax register and the ebx register
; no need for extra registers to store those values, just push them onto the stack and later pop them as shown below.
push eax
push ebx
mov eax, 4
mov ebx, 1
int 0x80
pop ebx
pop eax
ret
然后在你的程序中使用如下: -
mov eax, 45 ; some important value you want to preserver
mov ecx, msg ; msg to print.
mov edx, len ; length of the message to print.
call print ; // value of eax will be preserved.