该程序将无法正常运行,因为 DX 没有指向“str1”的地址。
首先,将 str1 的地址压入 SP 指向的堆栈。这没问题。
但是当你调用一个函数“show_str”来打印str1之后,SP将不再指向str1,因为原来IP的值被压入了SP指向的堆栈,现在。
你没有意识到 SP 的变化,仍然试图将 SP 的值传递给 DX,DX 应该存储要打印的字符串的地址。
我的建议是你应该使用“正常”的风格来编写程序,因为除非你在探索语言本身的秘密,否则这会让我们的生活更轻松。
这是我的程序。
;file: showmsg.asm (.COM)
;nasm -fbin showmsg.asm -o showmsg.com
org 0x100
mov ax, cs
mov ds, ax
mov ax, str1 ;Transmit parameter to show_msg through AX
call show_msg
mov ax, 4c00h
int 21h
show_msg: ;the address offset of the string is stored in ax
mov dx, ax ;DS:DX=string address
mov ax, 0900h ;AH=09
int 21h
ret
str1: db "Hello, world!$"