在Linux IA-32汇编程序(gas)上创建子字符串

时间:2008-12-31 09:00:34

标签: linux assembly x86 gas

我想创建一个由原始(thestring)中的3个asciz字符组成的子串(ministring)。这个东西在运行时不打印所以我不知道我到底在做什么。为什么不打印?我正确地创建了迷你弦吗?

.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 个答案:

答案 0 :(得分:1)

你没有预留足够的内存空间来包含你正在创建的以null结尾的ministring ...因此,当你写入这个内存时,你将覆盖formatd和format的值(所以你''最终将“%s”以外的内容传递给printf)。

请尝试使用以下内容,而不是您对ministring内存位置的定义:

ministring: .asciz "   "

此外,而不是:

movl %eax, ministring(%ecx,1)

我不明白为什么你不使用它:

movb %al, ministring(%ecx,1)

另外,如果你想打印ministring,那么而不是:

movl thestring, %eax

这样做:

movl ministring, %eax

而不是这个:

addl $4, %esp

为什么不这样:

addl $8, %esp

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

  • 单步执行代码
  • 在您逐步​​完成时,观察寄存器和内存中包含的值
  • 了解任何分段错误的位置