我目前有三段内存,我的主要数据段,堆栈段和我的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
答案 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)假设bx
是ds
中的指针,6)增加存储在那里的值(cursorRow的值)。
答案 1 :(得分:0)
看起来你只是将cursorRow的值推到了堆栈上。没有地址,您无法更新它。使用该地址,您可以轻松地引用该地址的值,将其放入寄存器,对其执行操作,然后获取该寄存器中的值并将其放入cursorRow的地址。