我试图从8086汇编中的数组输出一个字符串

时间:2013-04-13 19:16:57

标签: assembly x86 dos x86-16

BITS 16
ORG 0x0100

SECTION .text
MAIN:

      mov DI,array
      call GetString
      call Putln
      call PutString
      call Putln
      mov SI,array
      ;jmp Next

;Next:
      mov AX,4C00H
      ;mov AL,00H
      int 21H

%INCLUDE 'STDIO.ASM'

SECTION .data
mesg db  'I','h','a','t','e','a','s','s','e','m','b','l','y' ;


SECTION .bss
array resb 256  ;reserve 256 bytes of space



Putch:                   ;outputs character in DL
     push DI
     mov AH,02H
     int 21H
     pop DI

     ret

Getch:                   ;inputs a character into AL
     push DI
    ; mov BH,AH
     mov AH,08H
     int 21H
    ; mov AH,BH
     mov DL,AL
     pop DI
     ret

Putln:                 ;prints out a new line
    mov AH,02H
    mov DL,CR
    int 21H
    mov DL,LF
    int 21H
    ret

GetString:
        call Getch
        cmp DL,0DH
        je End
        call Putch
        stosb
        jmp GetString

End:
  mov AL,00H
  stosb
  ret


PutString:
       cld
       lodsb
       cmp AL,00H
       jz End1
       mov DL,AL
       call Putch
       jmp PutString

End1:
    ret

SECTION .data
;mesg db  'I',' ','h','a','t','e',' ','a','s','s','e','m','b','l','y' ;
CR  equ  0AH
LF  equ  0AH

我正在尝试从8086程序集中的数组输出一个字符串,但是当我运行它时,即使我可以输入字符,当我按Enter键时它给了我symblols。

1 个答案:

答案 0 :(得分:2)

我认为您的数据段寄存器可能未正确设置。 当您在实模式下操作时,最好使用

启动程序
mov ax,.data    ; The way this is done can vary between assemblers
mov ds,ax

另外,只要我记得,DOS调用不是以零终止字符串运行,而是在末尾运行'$',所以原因可能是您没有按如下方式声明mesg:< / p>

mesg db 'I love assembly!$'

(实际上,你似乎没有以任何方式终止字符串)