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

您没有保留足够的内存空间来包含您正在创建的以空字符结尾的迷你字符串......因此,当您写入此内存时,您将覆盖 formatd 和 formats 的值(因此您最终会通过除了 "%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

另外我建议您使用调试器:

  • 单步执行代码
  • 单步执行时观察寄存器和内存中包含的值
  • 知道任何分段错误的位置
于 2008-12-31T09:18:06.647 回答