Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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 试图在堆栈上创建两个局部变量,但只能创建一个_Assembly_X86_Masm - Fatal编程技术网

Assembly 试图在堆栈上创建两个局部变量,但只能创建一个

Assembly 试图在堆栈上创建两个局部变量,但只能创建一个,assembly,x86,masm,Assembly,X86,Masm,我试图在堆栈上创建两个局部变量,它们是计数器 对于两个循环,但我只能创建一个。我需要推送我不能推送的变量吗 在堆栈上创建一个局部变量,还是我的做法都错了?以下是我目前掌握的代码: .386 .model flat,stdcall .stack 100h printf proto c arg1:ptr byte, printlist:vararg .data array dword 180,8,9,10,40,80,0 fmtmsg2 db 0dh,0ah,0 fmtmsg1 db "%d

我试图在堆栈上创建两个局部变量,它们是计数器 对于两个循环,但我只能创建一个。我需要推送我不能推送的变量吗 在堆栈上创建一个局部变量,还是我的做法都错了?以下是我目前掌握的代码:

.386
.model flat,stdcall
.stack 100h

printf proto c arg1:ptr byte, printlist:vararg

.data

array dword 180,8,9,10,40,80,0
fmtmsg2 db 0dh,0ah,0
fmtmsg1 db "%d ",0
counter dword 6,0
.code

bubbleSort proc
  push ebp
  mov ebp,esp
  sub esp,4
  mov dword ptr[ebp - 4],0
  mov esi,[ebp + 12]
  mov ebx,[ebp + 8]

  ;trying to create two local variables but only can create one
  mov edx,0
  ;mov ecx,0


innerloop:
        inc dword ptr[ebp - 4]       ;========>   ;inc ecx           
        cmp dword ptr[ebp - 4],ebx   ;=========> ;cmp ecx,ebx         
      je outerloop       
      mov eax,[esi]      
      cmp eax,[esi + 4]  
      Jge noexchange 
        ;exchange values   
      xchg eax,[esi+4]   
      mov [esi],eax      
  noexchange:
      add esi,4           
      jmp innerloop          

outerloop:
     mov esi,offset array

     ;inner loop counter
     mov dword ptr[ebp - 4],0           ;========>;mov ecx,0 

     ;outer loop counter
     inc edx     

     cmp edx,ebx
     jne innerloop

     ;loop 3 counter
     mov edx,0

     ;load array offset
     mov esi,[ebp + 12]

     mov esp,ebp
     pop ebp
     ret 8
bubbleSort endp

displayArray proc
     push ebp
     mov ebp,esp
     mov esi,[ebp + 12]
     mov ebx,[ebp + 8]
     mov edx,0

     loop3:
     mov eax,[esi]
     push edx
     invoke printf,addr fmtmsg1,eax
     pop edx

     add esi,4
     inc edx
     cmp edx,ebx
     jne loop3

     invoke printf,addr fmtmsg2

     pop ebp
     ret 8
displayArray endp

public main

main proc

      push offset array
      push counter
      call bubbleSort

      push offset array
      push counter
      call displayArray

     ret
main endp

end main

当我尝试添加另一个局部变量时,程序崩溃了,我不知道问题出在哪里。

请记住,堆栈向下增长-因此,在堆栈上传递的参数为正(相对于堆栈指针或其在ebp中的副本),局部变量(存储在插入的“孔”中)为负,返回地址为负(代码通常未使用)的值为0


要分配2个4字节的变量,您需要从堆栈中分配8个字节,并将它们称为相对于ebp的-4和-8。

有点不清楚。您想更改当前代码(使用代码中唯一基于堆栈的本地变量
[ebp-4]
)要使用ecx或其他方法?您是否将寄存器变量与堆栈变量混淆?nvm没问题我尝试添加mov dword[ebp-8]并在堆栈上分配两个局部变量,但只有一个有效,但两个都无效我会自己解决的谢谢您是否记得将初始分配更改为sub esp,8?
sub     esp, 4          ; allocates 4 (extra) bytes on the stack.
    ....
mov dword ptr[ebp - 4],0   ; References those 4 bytes
    ....
mov esp,ebp                ; Puts the stack pointer back where it was