0

我目前有三个内存段,我的主要数据段、堆栈段和我的 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

4

2 回答 2

0

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

inc [ds:bp+8]

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

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

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

于 2011-07-12T04:02:51.073 回答
0

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

于 2012-02-13T19:38:49.940 回答