gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:06 25 4
gpt4 key购买 nike

我想从我的原始字符串 (thestring) 中创建一个包含 3 个 asciz 字符的子字符串 (ministring)。这东西在运行时没有打印,所以我不知道我到底在做什么。为什么它不打印?我是否正确创建了 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

最佳答案

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

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

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

关于linux - 在 Linux IA-32 汇编程序 (gas) 上创建一个子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/402579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com