Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 创建局部变量后,如何使用bp访问堆栈上的元素?_Assembly_Nasm_X86 16 - Fatal编程技术网

Assembly 创建局部变量后,如何使用bp访问堆栈上的元素?

Assembly 创建局部变量后,如何使用bp访问堆栈上的元素?,assembly,nasm,x86-16,Assembly,Nasm,X86 16,我使用的是NASM8086。 如何使用bp访问堆栈上的第三和第四个元素? 这是我的密码 mov ax, 1 push ax ; 1st element on stack mov ax, 2; 2nd element on stack push ax push bp ; save old value of bp mov bp, sp ; make bp our reference point sub sp, 2 ; creates a local variable,it can be acce

我使用的是NASM8086。 如何使用bp访问堆栈上的第三和第四个元素? 这是我的密码

mov ax, 1
push ax  ; 1st element on stack
mov ax, 2; 2nd element on stack
push ax

push bp ; save old value of bp
mov bp, sp ; make bp our reference point
sub sp, 2 ; creates a local variable,it can be accessed by [bp-2]

mov bx,3
push bx ; 3rd element on stack
mov cx,4
push cx ; 4th element on stack

mov bx, [bp+6] ; load 1st element in bx
mov cx, [bp+4] ; load 2nd element in cx
mov ax, [bp-2] ; load local variable in ax

现在,如何编写bp来访问堆栈上的第三个和第四个元素,如果您希望例程获得4个参数,那么第三个元素将位于
[bp-4]
,而“第四个”将位于
[bp-6]

push bp ; save old value of bp
mov bp, sp ; make bp our reference point
sub sp, 2 ; creates a local variable,it can be accessed by [bp-2]
此外,您必须通过以下方式终止您的功能:

mov esp, ebp
pop ebp
该守则:

mov bx,3
push bx ; 3rd element on stack
mov cs,4
push cx ; 4th element on stack
看起来您正在尝试为新函数调用准备参数

这应该略有不同:

要匹配cdecl(此示例使用cdecl)调用约定(如果要将asm与c等一起使用,则需要这样做),您必须按相反顺序推送输入参数-假设需要4个输入参数(ints-32位)。C/C++调用func(0xaa,0xbb,0xcc,0xdd)的Asm转录本如下所示:

push 0DDh   4bytes
push 0CCh
push 0BBh
push 0AAh
call func   // another 'push'
add esp, 10h
现在,您的日常工作可能如下所示:

push ebp    //next push
mov ebp, esp

// your args are '2 pushes' away (call, push ebp) = 8 bytes away
// hence 1st arg is [ebp+8], 2nd is [ebp+12], 3rd is [ebp+16], 4th is [ebp+20]
// loading args to regs

mov eax, dword ptr [ebp+8]   // 0xAA - 1st arg
mov ebx, dword ptr [ebp+12]  // 0xBB - 2nd arg
mov ecx, dword ptr [ebp+16]  // 0xCC - 3rd arg
mov edx, dword ptr [ebp+20]  // 0xDD - 4th arg

mov esp, ebp
pop ebp
ret
但是如果您想使用局部变量,下面是如何使用2个局部变量和4个作为参数传递的int变量:

push ebp
mov ebp, esp

sub esp, 8  // for 2 local int(32bit) variables

mov dword ptr[ebp-4], 3   // set one local var to 3
mov dword ptr[ebp-8], 4   // set one local var to 4

mov eax, dword ptr [ebp+8]   // 0xAA - 1st arg
mov ebx, dword ptr [ebp+12]  // 0xBB - 2nd arg
mov ecx, dword ptr [ebp+16]  // 0xCC - 3rd arg
mov edx, dword ptr [ebp+20]  // 0xDD - 4th arg

add esp, 8 // remove space for local vars

mov esp, ebp
pop ebp
ret

当你显然是指
mov-cx,4
时,注意你的
mov-cs,4
。中途更改代码段不太好。您不必先移动注册表、val,然后再按注册表-您可以直接按val