;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
我的问题:
答案 0 :(得分:0)
offset存储第一个char的地址。在这种情况下它是'h'..所以dx不保持整个字符串,但第一个字符的地址,可能lea也作为偏移...解决了第二个问题,如果我是对的..但是怎么来db存储6个字节的字符?因为它只能处理8位或1个字节
答案 1 :(得分:0)
db可以存储8位数据但是hello $的大小为6字节(1 char = 8位)。如果字符串大于db的容量,它如何存储字符串?
它不存储整个hello$
,而是存储hello$
的{{1}},在这种情况下是 h (字符串的起始字符) )。
这是您的字符串存储在内存中的方式:
假设DS:SI寄存器(您声明的任何变量将在内存中分配一个地址,该地址由DS指示:DI寄存器在一起)指向内存中的地址07200
。假设您的字符串的偏移量(在您的情况下为h)已放置在此位置。现在偏移后的所有其他字符将存储在连续的内存位置,因此07200
将存储h
,07201
将存储e
,07202
将存储{ {1}}等等。所以这样l
变量只需要存储偏移量,因为它知道它会在偏移量后找到字符串的所有其他字符(因为数组存储在连续的内存中)
如果我写MOV DX,MSG显示错误(因为dx是8位寄存器,字符串比它的容量大)。但它可以写成MOV DX,OFFSET msg或LEA DX,msg。你能解释一下偏移量和放大率吗? lea呢?
首先DX不是8位而不是16位寄存器而msg
INT 21h
服务需要将您的字符串的偏移量放在DX
寄存器中然后从那里继续打印控制台上的字符,直到遇到 $ (字符串终止字符),因此写msg DX, MSG
骚扰09h
INT 21h
服务,这就是它抛出错误的原因。 mov dx, offset msg
和lea dx, msg
(OFFSET)都将字符串的偏移量放在DX寄存器中。