offset

str db 'Hello,ASM~$'
str是标号
当 mov dx,str 时,其含义为 mov dx,[标号],则 mov dx,'H'
所以肯定报错

str: db 'Hello,ASM~$'
str:是标号的地址
当 mov dx,str 时,其含义为 mov dx,标号的地址,则正确

assume cs:code,ds:data,ss:stack

stack segment
     db 20 dup(0)
ends

data segment  
     db 3 dup(0)
     str: db 'Hello,ASM~$'
ends

code segment
start:
     mov ax,data
     mov ds,ax
     mov ax,stack
     mov ss,ax
     
     mov dx,str
     mov ah,9h
     int 21h
     
     mov ah,4ch
     int 21h
ends
end start

另外可以使用offset来解决此问题

assume cs:code,ds:data,ss:stack

stack segment
     db 20 dup(0)
ends

data segment  
     db 3 dup(0)
     str db 'Hello,ASM~Hello,ASM~$'
ends

code segment
start:
     mov ax,data
     mov ds,ax
     mov ax,stack
     mov ss,ax
     
     mov dx,offset str
     mov ah,9h
     int 21h
     
     mov ah,4ch
     int 21h
ends
end start

也就是说
str db 'Hello,ASM~$' 与
mov dx,offset str 成组使用

str: db 'Hello,ASM~$' 与
mov dx,str 成组使用

打印代码:

打印操作为向ah寄存器传入9h,此时CPU会根据dx寄存器的信息来打印数据,遇到‘$’时结束

mov ah,9h
 int 21h
退出代码:

退出代码为调用dos系统的退出功能

mov ah,4ch
int 21h

你可能感兴趣的:(offset)