создание подстроки на ассемблере Linux IA-32 (газ) - PullRequest
1 голос
/ 31 декабря 2008

Я хочу создать подстроку (ministring) из 3 символов asciz из моего оригинала (thestring). Во время бега это не печатает, так что я не знаю, что, черт возьми, я делаю. Почему это не печать? Я правильно создаю министерство?

.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

1 Ответ

1 голос
/ 31 декабря 2008

Вы не зарезервировали достаточно места в памяти для хранения созданной нулем министроки, которую вы создаете ... поэтому, когда вы пишете в эту память, вы перезаписываете значение formatd и форматов (и поэтому вы ' в конечном итоге передать что-то отличное от "% s" в printf).

Вместо определения местоположения памяти ministring попробуйте использовать следующее:

ministring: .asciz "   "

Также вместо этого:

movl %eax, ministring(%ecx,1)

Я не понимаю, почему вы не используете это вместо:

movb %al, ministring(%ecx,1)

Кроме того, если вы хотите напечатать мини-строку, то вместо этого:

movl thestring, %eax

Сделайте это:

movl ministring, %eax

Также вместо этого:

addl $4, %esp

Почему бы не это:

addl $8, %esp

Также я предлагаю вам использовать отладчик для:

  • Шаг через код
  • Наблюдайте за значениями, содержащимися в регистрах и в памяти, когда вы шагаете по
  • Знать место любой ошибки сегментации
...