【发布时间】:2019-10-01 04:19:41
【问题描述】:
我是汇编初学者,我有这个作业,我必须创建一个 strlen 函数来查找任何字符串的长度。
我尝试从edx 中减去 4,因为最后我看到了 4 个额外的字符,但这并没有解决任何问题。他们还在那里。
section .data
text: db "Hello world, trying to find length of string using function." ;our string to be outputted
section .text
global _start ;declared for linker
_start:
mov eax, 4 ;system call number (sys write)
mov ebx, 1 ;file descriptor to write-only
mov ecx, text ;message to output
call strlen
mov edx, len ;length of string to print
int 80h ;interrupt
exit:
mov eax, 1 ;system call number (sys exit)
mov ebx, 0 ;file descriptor to read-only
int 80h ;interrupt
strlen:
push ebp ;prologue, save base pointer
mov ebp, esp ;copy esp to ebp
push edi ;push edi for use
;body
mov edi, text ;save text to edi, and i think when i do that edi expands? if text = 5 bytes, and edi was originally 4, then edi becomes 5?
sub edi, esp ;subtract edi starting point by the esp starting point to get len. ex: edi = 100, esp = 95
mov [len], edi ;copy value of edi onto len
pop edi ;epilogue, pop edi out of stack
mov esp, ebp ;return esp back to top of stack
pop ebp ;pop ebp back to original
ret ;return address
section .bss
len: resb 4 ;4 byte to integer
假设我在.data 部分中有以下代码:
section .data
text: db "Hello world, trying to find length of string using function."
预期的输出应该是 “Hello world,尝试使用函数查找字符串的长度。”,但是我得到 “Hello world,尝试使用函数查找字符串的长度。 ####" 其中# 是任意随机字符。
谢谢。
【问题讨论】:
-
您不是在查看字符串中的字节,而是在计算
.data部分和堆栈之间的距离。如果您想查找一个,Stack Overflow 上有大量 strlen 函数示例,否则请从头开始重新启动您的strlen函数,因为您当前的尝试完全走错了轨道。您甚至没有使用ecx中的 arg 您传入调用者,而是将其硬编码为采用text的 strlen。 -
@Peter Cordes 谢谢,这是我的第一个作业(教授只是要求我们在 .data 中查找文本的长度而没有指定它),在我意识到我是查看 .data 部分之间的距离,而不是字节。我现在把它作为我的code,它似乎输出了我想要的东西。如果有什么我可以解决的,请告诉我。
-
大多数汇编程序不会将终止 0 添加到使用 db "..." 声明的字符串中。要处理此问题,请使用 db "...",0 附加终止 0。
-
是的,您只是在为长度计算一些随机垃圾大值,而不是在字节上循环,直到找到终止的
0字节。 (您必须确保数据中有 db "foo", 0). Thenwrite()` 将数据向上写入,直到它进入未映射的页面并返回-EFAULT,但将有效字节复制到标准输出文件描述符已经发生了。可能你的字符串后面的字节都是0巧合,所以你不会在终端上注意到它们。'\0'打印为零宽度。 -
对我之前的评论的补充:除了计算垃圾之外,您还使用
len的绝对地址 作为长度而不是该内存的内容。因此,有两个引人注目的错误,其中一个只是语法,另一个基于明显的基本误解。 :/(Sep 的回答指出了这一点;我在评论时没有看来电者。)