5

すみません。私はアセンブリ言語を学ぶことを理解しようとしています。しかし、私には多くの問題があります。NASM で文字列を操作しようとしています。文字列定数を文字列変数にコピーしました。最大サイズは 50 です。そのため、この境界を確認したいと思います。ただし、このプログラムはセグメンテーション違反をスローします。MASM の例を使用しているため、おそらく NASM 構文の使用エラーが存在します。私のプログラムは次のとおりです。

section .data                                                                                                                    
   MAXTEXTSIZE equ 50
   _cte_hola db "Hola", 0
   _cte_mundo db "Mundo", 0

section .bss
   MAIN_d resb MAXTEXTSIZE+1

section .text
      global _start

strlen:
  mov bx, 0
  strl01:
  cmp WORD [SI+BX],0 t
  je strend 
  inc bx 
  jmp strl01
strend:
  ret

strcpy:
   call strlen 
   cmp bx, MAXTEXTSIZE 
   jle copiarsizeok    
   mov bx, MAXTEXTSIZE
copiarsizeok:mov cx, bx
   cld 
   rep movsb 
   mov al,0 
   mov BYTE [DI], al
   ret


_start:
  mov ds, ax
  mov es, ax
  mov si, [MAIN_d]
  mov di, [_cte_hola]
  call strcpy
  mov eax, 1
  mov ebx, 0
  int 80h  

事前に感謝し、失礼します。私の質問は、アセンブリ プログラマーにとってばかげています。

4

2 に答える 2

2

Linuxで32ビットプログラムを作ろうとしていると思いますが、あなたの例は16ビットです。

  1. Linux では、すべてのポインターは 32 ビットです。そのため、esi、edi、ebx などの拡張レジスタを使用します。8 ビットおよび 16 ビットのレジスタを算術およびデータ処理に使用できますが、メモリ ポインタとしては使用できません。

  2. byte [esi+ebx], 0strlenでは、単語ではなく比較する必要があります。

  3. Linux ではセグメント レジスタを設定しないでください。それらはOSによって設定され、触れることはできません。Linux では、すべてのメモリが 1 つのフラットな領域であり、セグメント レジスタを使用する必要がなくなりました。

于 2013-11-05T20:15:49.430 に答える
2

関数を作成する方法のより具体的な例を次に示しますstrlen(これが最初の問題です)。

section .data
  MAXTEXTSIZE equ 50
  _cte_hola  db "Hola",  0xa, 0
  _cte_mundo db "Mundo", 0

section .bss
  MAIN_d resb MAXTEXTSIZE+1

section .text
  global _start

strlen:
  mov ebx, 0
strlen_loop:
  cmp BYTE [esi+ebx], 0
  je strlen_end
  inc ebx
  jmp strlen_loop
strlen_end:
  mov eax, ebx
  ret

_start:
  mov esi, _cte_hola
  call strlen ; Get the length of _cte_hola

  mov edx, eax ; The length was stored in eax by strlen
  mov ecx, _cte_hola
  mov ebx,1
  mov eax, 4
  int 0x80 ; Write to stdout

  mov eax, 1
  int 0x80 ; Exit

これを実装するより良い方法は間違いなくありますが (repneたとえば、strlen を実装するために使用します)、実装に近づけたいと思いました。

お役に立てれば!

于 2013-11-05T20:40:26.397 に答える