我正在开发一个包含两个程序的程序。一种将包含 N 个无符号双字的数组推入堆栈,另一种将 N 个无符号双字从堆栈中弹出并将它们存储在数组中。esp
我能够成功地将所有元素推入堆栈,但是由于堆栈指针(寄存器)已更改,因此该过程无法返回主程序。
我已经能够通过操作寄存器返回到mainesp
以便保存返回地址,并esp
在返回之前重新加载该地址。但是,在调用下一个过程时,我推入堆栈的条目已被覆盖。
在过程中工作时是否有正确的方法将数据保存在堆栈中?
这是我的一些代码:
主要程序:
main PROC
main_loop:
; Main menu
mov edx, offset choicePrompt
call WriteString
read_input:
call ReadInt
jno good_input
jmp main_loop
good_input:
cmp eax, 0
je create_vector
cmp eax, 1
je array_stack
cmp eax, 2
je stack_array
cmp eax, -1
je end_program
call crlf
jmp main_loop
create_vector:
call CreateVector
jmp end_options
array_stack:
call ArrayToStack
jmp end_options
stack_array:
call StackToArray
jmp end_options
end_options:
call crlf
jmp main_loop
end_program:
mov edx, offset exitPrompt
call WriteString
call crlf
exit
main ENDP
在ArrayToStack过程中将数组推入堆栈:
mov esi, offset Vector
mov ebx, N
dec ebx
mov eax, 0
mov ecx, -1
push_array_loop:
inc ecx
mov al, [esi + ecx]
push eax
mov [esi + ecx], byte ptr(0)
cmp ecx, ebx
jl push_array_loop
在StackToArray过程中将堆栈写入控制台:
mov eax, N
mov ebx, 4
mul ebx
mov ebx, eax
mov ecx, 0
write_stack_loop:
mov eax, [esp + ecx]
add ecx, 4
call WriteDec
mov edx, offset spacePrompt
call WriteString
cmp ecx, ebx
jl write_stack_loop