;CODE FOR PRINTING A STRING IN 8086 ASSEMBLY LANGUAGE:
.model small
.stack 100h
.data
msg db 'hello$'
.code
main proc
mov dx,@data
mov ds,dx
mov dx,offset msg ;lea dx,msg
mov ah,9
int 21h
mov ah,4ch
int 21h
main endp
end main
我的问题:
- db可以存储8位数据,但是Hello $是6个字节(1个字符= 8位)。如果字符串更大,则如何存储字符串?
- 如果我编写MOV DX,MSG会显示错误(因为DX是8位寄存器,并且字符串更大,则其容量更大)。但是,当它写为MOV DX,Offset MSG或Lea DX,MSG时,它起作用。您能解释什么偏移&lea?
db可以存储8位数据,但Hello $是6个字节(1个字符= 8位)。如果字符串更大,则如何存储字符串?
它不存储hello$
整体上,而是存储hello$
的偏移,在这种情况下,它是 h (String的启动字符)。
这是将您的字符串存储在内存中的方式:
可以说DS:SI寄存器(指向某些内存地址/位置通常是您在程序中声明的变量的地址。)存储地址07200
。并假定偏移(在您的情况下为'H')已分配此地址。现在,偏移之后的所有其他字符都将存储在连续的内存位置,因此地址07200
将存储h
,07201
将存储e
,07202
将存储l
等。因此,以这种方式,msg
变量只需要存储偏移,因为它知道它会在偏移之后找到字符串的所有其他字符(数组存储在连续内存中)。
如果我编写MOV DX,MSG会显示错误(因为DX为8位寄存器,并且字符串更大,则其容量更大)。但是,当它写为MOV DX,Offset MSG或Lea DX,MSG时,它起作用。您能解释什么偏移&lea?
首先,DX不是8位,而是其16位寄存器和INT 21h
的09h服务需要将字符串的偏移放在DX
寄存器中,然后从那里不断将字符打印在控制台上,直到遇到 $(字符串终止字符)因此编写msg DX, MSG
UPSETS 09h
INT 21h
的服务,这就是为什么会引发错误的原因。mov dx, offset msg
和lea dx, msg
(负载效果地址)都将字符串的偏移放在DX寄存器中。
OFFSET存储了第一个字符的地址。在这种情况下,它是" h"。因此,dx不能容纳整个字符串,但是第一个字符的地址,可能也可以作为偏移...解决第二个问题。存储6个字节char?因为它能够处理8bits或1个字节