Я хочу создать подстроку (министроку) из 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





Вы не зарезервировали достаточно места в памяти, чтобы содержать мини-строку с завершающим нулем, которую вы создаете ... поэтому, когда вы пишете в эту память, вы перезаписываете значение formatd и форматов (и поэтому вы в конечном итоге передаете что-то кроме "% 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
Также я предлагаю вам использовать отладчик, чтобы:
Сделал оба изменения. По-прежнему выдает ошибку сегментации
Я снова отредактирую, чтобы также предложить вам поменять местами последовательность, в которой вы нажимаете параметры.
Нет, я не буду предлагать этого (но "addl $ 4,% esp" будет иметь для меня больше смысла, чем "addl $ 4,% esp").
Я имел в виду, что фраза «addl $ 8,% esp» будет для меня более понятной.
Да, но эта последняя инструкция не имеет значения, если последуют системные вызовы и вызовы выхода. Вы даже можете опустить addl, если больше не будете работать со стеком. Были ли предложены все изменения, и в результате все еще возникла ошибка сегментации.
Вы все время это говорите, а мне приходится гадать: так, где это ошибка ?? Используйте отладчик !! Кроме того (я не знаком с этим ассемблером), является ли оператор "pushl $ форматы", подталкивающий адрес или выталкивающий содержимое памяти "форматов"? Будет ли лучше "форматы pushl"?
Я отредактировал свой пост, чтобы добавить предложение использовать movb вместо movl. Кроме того, возможно, вам следует использовать отладчик для пошагового выполнения этого кода, а также для проверки памяти и содержимого регистра.