在变量中存储字符串并以8086汇编语言打印出来

时间:2017-11-30 13:05:26

标签: emu8086

;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 char = 8位)。如果字符串大于db的容量,它如何存储字符串?
  2. 如果我写MOV DX,MSG显示错误(因为dx是8位寄存器,字符串比它的容量大)。但它可以写成MOV DX,OFFSET msg或LEA DX,msg。你能解释一下偏移量和放大率吗? lea呢?

2 个答案:

答案 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将存储h07201将存储e07202将存储{ {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 msglea dx, msgOFFSET)都将字符串的偏移量放在DX寄存器中。