【问题标题】:creating a substring on Linux IA-32 assembler (gas)在 Linux IA-32 汇编器(gas)上创建子字符串
【发布时间】:2008-12-31 09:00:34
【问题描述】:

我想从我的原始字符串(字符串)中创建一个包含 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

【问题讨论】:

    标签: linux assembly x86 gnu-assembler


    【解决方案1】:

    您没有保留足够的内存空间来包含您正在创建的以 null 结尾的迷你字符串...因此,当您写入此内存时,您将覆盖 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
    

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

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

    【讨论】:

    • 我编辑了我的帖子,以添加使用 movb 而不是 movl 的建议。此外,也许您应该使用调试器来单步执行此代码,并检查内存和寄存器内容。
    • 进行了两项更改。仍然给出Segmentation Fault
    • 我将再次编辑以建议您交换推送参数的顺序。
    • 不,我不建议这样做(但是,“addl $4, %esp”对我来说比“addl $4, %esp”更有意义)。
    • 我的意思是,“addl $8, %esp”对我来说更有意义。
    猜你喜欢
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2014-01-03
    相关资源
    最近更新 更多