1

元の文字列 (文字列) から 3 つの asciz 文字の部分文字列 (ミニ文字列) を作成したい。実行中に印刷されないので、自分が何をしているのかわかりません。なぜ印刷されないのですか?ミニストリングを正しく作成していますか?

.section .data

thestring: .asciz "111010101"

ministring: .asciz ""

formatd:    .asciz "%d"
formats:    .asciz "%s"
formatc:    .asciz "%c"




.section .text

.globl _start

_start:

xorl %ecx, %ecx

ciclo:movb thestring(%ecx,1), %al
movzbl %al, %eax
movl %eax, ministring(%ecx,1)
incl %ecx
cmpl $3, %ecx
jl ciclo


movl thestring, %eax
pushl %eax
pushl $formats
call printf
addl $4, %esp


movl $1, %eax
movl $0, %ebx
int $0x80
4

1 に答える 1

1

作成している null で終わるミニストリングを格納するのに十分なメモリ スペースを予約していません。したがって、このメモリに書き込むと、formatd とformats の値が上書きされます (したがって、最終的には"%s" 以外のものを printf に)。

ミニストリングのメモリ位置を定義する代わりに、次を使用してみてください。

ministring: .asciz "   "

また、これの代わりに:

movl %eax, ministring(%ecx,1)

代わりにこれを使用しない理由がわかりません:

movb %al, ministring(%ecx,1)

また、ミニストリングを印刷したい場合は、次の代わりに:

movl thestring, %eax

これを行う:

movl ministring, %eax

また、これの代わりに:

addl $4, %esp

なぜこれではないのですか:

addl $8, %esp

また、デバッガーを使用して次のことを行うことをお勧めします。

  • コードをステップ実行する
  • ステップスルーするときに、レジスタとメモリに含まれる値を監視します
  • セグメンテーション違反の場所を知る
于 2008-12-31T09:18:06.647 に答える