V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Danswerme
V2EX  ›  问与答

请教大家一个关于汇编的问题。

  •  
  •   Danswerme · 2021-07-18 17:16:50 +08:00 · 1384 次点击
    这是一个创建于 1229 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在学习王爽的《汇编语言第三版》时,有个示例要求利用栈将程序中的数据逆序存放;无论是作者的例子,还是我稍微修改后的程序运行结果都没有问题,但是不知道为什么栈内的内容总是和预期的不一致,请大家帮我解答一下。

    作者的例子如下:


    61L57dkNTx3Vzot


    我觉得既然只是逆序存放 8 个字型数据,那就用 dw 定义 8 个字型数据就行了,无需 16 个;然后我就重新只定义了 8 个字型数据,同时将初始的栈顶偏移地址改为了 20H 。


    AUO4lCyQD6W5P8p

    然后用 DEBUG 进行调试,跳转到第一次循环结束的地方,入栈的结果 076A:10 1F 是正常的,但是原数据的后四个 076A:8 F 被改写了。


    PNTmXcw3HCAMkDs

    再次跳转到程序结尾部分,逆序存放的结果 076A:0 F 是正确的,但是栈的后四位 076A:18 1F 又被改写了。


    HDxcFiZo7GU5dfV

    用 DEBUG 调试了一下作者的示例程序,发现也存在这样的情况,不仅栈的后四位 076A:28 2F 被改写了,就连没有使用的 076A:1A 1F 也被改写了。究竟是什么原因导致这些地方总是被改写了呢?


    sx5pMZEBP1gTeVm

    8 条回复    2021-07-18 23:31:27 +08:00
    dic
        1
    dic  
       2021-07-18 17:26:20 +08:00
    我看的是 《汇编语言第四版》,在学习过程中也发现了这个情况,不过书上说是由于中断导致的,让先不用管这种情况后续内容中会有说明。
    Danswerme
        2
    Danswerme  
    OP
       2021-07-18 17:39:27 +08:00
    @dic 谢谢,那我先往下看吧。
    senghoo
        3
    senghoo  
       2021-07-18 19:32:14 +08:00
    好久没看汇编了。仅仅猜测哈。
    这应该是传说中的 Stack overflow 吧。sp 寄存器下面(小于此地址的内存,stack 来说是上方)的空间被认为是空闲空间,中断处理程序什么的有可能用到空间。

    第一次循环结束时 sp=0x10,这时候其实栈已经满了(再往下走就是原始数据了),如果这个时候中断处理程序介入,就会覆盖原始数据。第二次循环结束时同理,你已经释放了栈空间( sp=20),如果这时候中断来,数据有可能改写。

    盲猜,要是有大佬请指正哈~~
    irytu
        4
    irytu  
       2021-07-18 20:35:50 +08:00 via iPhone
    @senghoo 中断处理应该是 trap 到内核 用的内核栈 怎么覆盖用户进程的 stack ?
    Danswerme
        5
    Danswerme  
    OP
       2021-07-18 21:59:23 +08:00
    @senghoo 还没看到中断这,等看到后面了再翻回来悄悄。
    senghoo
        6
    senghoo  
       2021-07-18 22:53:52 +08:00
    @irytu 这个是 x86 实模式下的吧,应该不涉及到内核态。中断发生时应该分别入栈标志寄存器、CS 还有 IP 。所以第一个 DosBox 的图 076A:000A-000F 分别是 00 35 ( IP )、6A 07(CS)、A3 01 ( FLAG) 应该能对的上。
    senghoo
        7
    senghoo  
       2021-07-18 22:56:01 +08:00
    @senghoo @irytu IP 写错了应该是 35 00
    irytu
        8
    irytu  
       2021-07-18 23:31:27 +08:00 via iPhone
    @senghoo 嗯 你说的对 原来是实模式… 没注意
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3379 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 00:42 · PVG 08:42 · LAX 16:42 · JFK 19:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.