Assembly 程序集地址指向一个地址

Assembly 程序集地址指向一个地址,assembly,linked-list,segmentation-fault,nasm,memory-address,Assembly,Linked List,Segmentation Fault,Nasm,Memory Address,我试图在汇编中建立一个链表(不要问为什么),链表必须在我建立的堆栈中。 我在ubuntu上使用带intel 80x86的nasm 这是链接列表: size_i: struc node data: resb 1 next: resb 4 endstruc size_of_struct: equ $-size_i 这是堆栈: create_stack: push STKSZ*4 call malloc add esp,4 ;correct the pus

我试图在汇编中建立一个链表(不要问为什么),链表必须在我建立的堆栈中。 我在ubuntu上使用带intel 80x86的nasm 这是链接列表:

size_i:
struc node
  data: resb  1
  next: resb  4
endstruc
size_of_struct: equ $-size_i
这是堆栈:

  create_stack:
  push  STKSZ*4
  call  malloc
  add       esp,4 ;correct the push
  mov   dword[my_stack],eax
  ret
现在,我们从用户那里读取一个数字,每个字节都被寻址到列表中的不同节点。 以下是我尝试创建新列表的方式:

create_new_list:
  push  size_of_struct
  call  malloc ;now eax has pointer to location
  add       esp,4 ;correct the push
  mov   edx,0
  mov   dl,byte[ebx] ;dl is the data of current number (current digit)
  mov   byte[eax+data],dl ;set the data
  mov   dword[eax+next],0 ;set next to be null  
  ;BUILD THE FIRST NODE IN EAX

  push  edx
  push  ecx
  push  eax
  mov   eax,0
  mov   ecx,dword[my_stack]
  mov   dword[curr_stack_pointer],ecx
  mov   ecx,0
  mov   cl,byte[counter]
  mov   al,4
  mul   cl
  add   dword[curr_stack_pointer],eax
  ;DWORD[CURR_STACK_POINTER] HAS THE POINTER TO HEAD OF LIST
  pop   eax
  mov   ecx,dword[curr_stack_pointer]

  mov   [ecx],eax ;THIS IS THE PROBLEMATIC LINE. HERE I AM TRYING TO 
                      ;MOV THE ADDRESS INSIDE EAX TO THE LOCATION OF ECX
                      ;THIS WAY I WILL HAVE IN THE CURRENT ARRAY BLOCK THE ADDRESS
                      ;OF THE HEAD OF THE LIST. BUT IT IS NOT WORKING, I GET A 
                      ;SEGMENTATION ERROR
  pop   ecx
  pop   edx

  ret
我该怎么做?
谢谢

这在DOS中不起作用

mov[cx],ax

但这会

mov[bp],ax


当用寄存器指向时,可能有一个规则,这在DOS中不起作用

push ebp
mov   ebp,dword[curr_stack_pointer]
mov   [ebp],eax
pop ebp
mov[cx],ax

但这会

mov[bp],ax

用寄存器指向时可能有一个规则

push ebp
mov   ebp,dword[curr_stack_pointer]
mov   [ebp],eax
pop ebp
如果它仍然失败,那么

mov   ebp,dword[curr_stack_pointer-4]
可能会走运

或者试试看

mov   ecx,dword[curr_stack_pointer]
mov   ebp,ecx
mov   [ebp],eax
ebp可能不接受dword[curr_stack_pointer-4]作为直接MOV

如果它仍然失败,那么

mov   ebp,dword[curr_stack_pointer-4]
可能会走运

或者试试看

mov   ecx,dword[curr_stack_pointer]
mov   ebp,ecx
mov   [ebp],eax

ebp可能不接受dword[curr\u stack\u pointer-4]作为直接MOV,我建议您确保
malloc
成功(即检查它是否返回非空指针)


此外,这两条线:

push  STKSZ*4
push  size_of_struct
最好写为:

push  strict dword STKSZ*4
push  strict dword size_of_struct
确保它实际上推送一个dword而不是一个字节(这实际上意味着推送一个字)


你乘以4有点太复杂了。它可以写为:

mov eax,dword [my_stack]
movzx ecx,byte [counter]
lea ecx,[eax+ecx*4]


并确保
计数器
在有效范围内(
0我建议您确保
malloc
成功(即检查它是否返回非空指针)


此外,这两条线:

push  STKSZ*4
push  size_of_struct
最好写为:

push  strict dword STKSZ*4
push  strict dword size_of_struct
确保它实际上推送一个dword而不是一个字节(这实际上意味着推送一个字)


4的乘法有点太复杂了。它可以写成:

mov eax,dword [my_stack]
movzx ecx,byte [counter]
lea ecx,[eax+ecx*4]


并确保
计数器
在有效范围内(
0在将ebp用作指针之前,您可能必须推送/存储ebp,然后使用pop或mov将其还原为原始值。具体取决于您的程序。-1用于调出与问题无关的实模式寻址模式限制,以及发布同一问题的多个答案,而不是编辑原始答案。您可以在将ebp用作指针之前,必须推送/存储ebp,然后使用pop或mov将其还原为其原始值。具体取决于您的程序。-1用于提出与问题无关的实模式寻址模式限制,以及用于发布同一问题的多个答案,而不是编辑原始答案。如果最后一个超级安全答案没用了,恐怕我没什么主意了。对不起,如果最后一个超级安全的没用了,恐怕我没什么主意了。对不起