更新位于堆栈及其段中的数据段中的变量

时间:2011-07-12 03:36:45

标签: variables assembly stack segment real-mode

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

2 个答案:

答案 0 :(得分: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)假设结果是ss中的指针,4)加载存储在那里的值(指向cursorRow的指针) )bx,5)假设bxds中的指针,6)增加存储在那里的值(cursorRow的值)。

答案 1 :(得分:0)

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