【问题标题】:Access data on the stack访问堆栈上的数据
【发布时间】:2015-01-09 11:53:38
【问题描述】:

我打算在汇编中编写程序,在字符串中搜索子字符串并写入包含子字符串的单词。例如:

字符串:“adgfh asdsd zxc dbasdas”

子字符串:“as”

输出:“asdsd dbasdas”

这个想法是只使用一个寄存器(DX)和堆栈来存储数据。我正在将字符串和子字符串推入堆栈。我的主要问题是 - 是否可以在不弹出数据的情况下访问堆栈顶部元素下的数据?我想使用 DX 来记住单词之间的空格并将字符串中的每个字母与字符串中的第一个字母进行比较,如果它是同一个字母,则增加字符串和子字符串中的指针以指向下一个字母单词和重做比较...等。

【问题讨论】:

    标签: string assembly stack


    【解决方案1】:

    是的,您可以访问堆栈上的项目,因为堆栈只是内存。但是,如果您处于 16 位模式,则不能使用 DX,您需要使用 BXSIDIBP。例如:

    mov bx, sp
    mov bl, ss:[bx+10]
    

    请注意,您需要 ss 段覆盖除 BP 之外的任何内容。 32位模式下可以直接使用ESP,如:

    mov dl, [esp+10]
    

    PS:对于第一个程序来说,这是一个相当奇怪的项目;)

    【讨论】:

    • 谢谢您的帮助!还有一个问题......有没有办法从堆栈中进入每个字符串的第一个字母,而无需先检查它们的长度然后添加到 ESP 的地址?因为使用一个注册表可能有点难以做到这一点:D 我也在考虑将每个字符串的长度推入堆栈顶部,然后将堆栈顶部的值添加到地址,但我不确定这是否将按预期工作:D(因为我需要 edx 来记住包含子字符串的单词的空格)
    • 如果您有更多问题,请单独发布。也就是说,是的,存储长度和调整地址听起来很合理。
    猜你喜欢
    • 2014-07-26
    • 2021-10-13
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    相关资源
    最近更新 更多