2

アセンブリでリンク リストを作成しようとしています (理由は聞かないでください)。リンク リストは、作成したスタック内にある必要があります。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

これどうやってするの?ありがとう!

4

3 に答える 3

0
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 は、直接 MOV として dword[curr_stack_pointer-4] を受け入れない場合があります

于 2013-05-21T11:02:05.630 に答える
-1

これはDOSでは機能しません

mov [cx],ax

しかし、これは

mov [bp],ax

レジスタを指すときのルールがあるかもしれません

于 2013-05-21T10:32:14.170 に答える