【问题标题】:Updating variable that lives in the data segment from the stack and its segment从堆栈及其段更新位于数据段中的变量
【发布时间】:2011-10-03 07:21:41
【问题描述】:

我目前有三个内存段,我的主数据段、堆栈段和我的 API 所在的段。以下指令从数据段执行,它们推送 cursorRow 和 welcomeMsg 的地址,然后对我的 API 段中的函数进行远调用。 cursorRow 变量位于调用 API 函数的主数据段中。调用如下所示:

  push cursorRow
  push welcomeMsg
  call API_SEGMENT:API_printString

如何通过堆栈更改我的 API 所在段内的 cursorRow? cursorRow 需要从 API 更新。没有 API 函数改变数据段。我尝试过类似的方法:inc byte [ds:bp+8]add [ds:bp+8], 1。 这是被调用的 API 过程:

printStringProc:
    push bp 
    mov bp, sp
    mov si, [bp+6]
    .printloop:
        lodsb
        cmp al, 0
        je printStringDone
        mov ah, 0x0E ; teletype output
        mov bh, 0x00 ; page number
        mov bl, 0x07 ; color (only in graphic mode)
        int 0x10
        jmp .printloop
    printStringDone:
    ; move the cursor down
    mov ah, 02h ; move cursor
    mov dh, [bp+8]
    mov dl, 0 ; column
    mov bh, 0 ; page number
    int 10h

    add [ds:bp+8], 1

  pop bp
  retf 

它打印字符串,但 cursorRow 变量没有正确更新。我希望我对我的问题足够清楚。很难解释 :D

【问题讨论】:

    标签: variables assembly stack segment real-mode


    【解决方案1】:

    这是因为您将指针传递给 cursorRow,而不是 cursorRow 本身。当你执行

    inc [ds:bp+8]
    

    你:1) 获取 bp 的值,2) 加 8,3) 假设结果是 ds 中的指针,4) 增加存储在那里的值(指向 cursorRow 的指针)。由于指针存储在堆栈中,因此您在执行此操作时会递增指针。你需要做的是从堆栈中取出指针并增加 that 指向的值。

    mov bx, [bp+8]
    inc [bx]
    

    此代码:1) 获取 bp 的值,2) 加 8,3) 假设结果是 ss 中的指针,4) 将存储在那里的值(指向 cursorRow 的指针)加载到 @987654327 @, 5) 假设bxds 中的一个指针,6) 增加存储在那里的值(cursorRow 的值)。

    【讨论】:

    • 您可以在调试器中运行它以确保加载正确的地址吗?如果您在虚拟机中运行,则可以使用内置的调试器编译 bochs。另外,光标是否正确移动?看来您还在使用指向 cursorRow 的指针作为该中断的 dh
    【解决方案2】:

    看起来您只是将 cursorRow 的值压入堆栈。没有地址,您将无法更新它。使用地址,您可以轻松引用该地址的值,将其放入寄存器,对其执行操作,然后获取该寄存器中的值并将其放入 cursorRow 的地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 2017-02-23
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多