将字符串存储在变量中,并用8086的汇编语言将其打印出来


;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

我的问题:

  1. db可以存储8位数据,但是Hello $是6个字节(1个字符= 8位)。如果字符串更大,则如何存储字符串?
  2. 如果我编写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将存储h07201将存储e07202将存储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 msglea dx, msg(负载效果地址)都将字符串的偏移放在DX寄存器中。

OFFSET存储了第一个字符的地址。在这种情况下,它是" h"。因此,dx不能容纳整个字符串,但是第一个字符的地址,可能也可以作为偏移...解决第二个问题。存储6个字节char?因为它能够处理8bits或1个字节

最新更新