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

发布于 2024-07-11 04:51:14 字数 578 浏览 10 评论 0原文

我想从我的原始字符串(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

I wanna create a substring (ministring) of 3 asciz chars out of my original (thestring). The thing ain't printing when being run so I don't know what the hell I'm I doing. Why it ain't printing? Am I creating the ministring correctly?

.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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

赤濁 2024-07-18 04:51:14

您没有保留足够的内存空间来包含您正在创建的以空结尾的迷你字符串...因此,当您写入此内存时,您将覆盖 formatd 和formats 的值(因此您最终会通过printf 中除“%s”之外的其他内容)。

不要使用您对迷你字符串内存位置的定义,而是尝试使用以下内容:

ministring: .asciz "   "

另外,而不是这个:

movl %eax, ministring(%ecx,1)

我不明白为什么您不使用这个:

movb %al, ministring(%ecx,1)

另外,如果您想打印迷你字符串,则不要使用这个:

movl thestring, %eax

这样做:

movl ministring, %eax

也可以代替这个:

addl $4, %esp

为什么不这样做:

addl $8, %esp

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

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

You haven't reserved enough memory space to contain the null-terminated ministring which you're creating ... therefore, when you write to this memory, you're overwriting the value of formatd and formats (and so you're eventually passing something other than "%s" to printf).

Instead of your definition of the ministring memory location, try using the following :

ministring: .asciz "   "

Also, instead of this:

movl %eax, ministring(%ecx,1)

I don't understand why you aren't using this instead:

movb %al, ministring(%ecx,1)

Also, if you want to print the ministring, then instead of this:

movl thestring, %eax

Do this:

movl ministring, %eax

Also instead of this:

addl $4, %esp

Why not this:

addl $8, %esp

ALso I suggest that you use a debugger to:

  • Step through the code
  • Watch the values contained in registers and in memory as you step through
  • Know the location of any segmentation fault
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文