Assembly 在两行上打印字符串

Assembly 在两行上打印字符串,assembly,dos,x86-16,a86,Assembly,Dos,X86 16,A86,我试图让我的程序在两行上显示一个字符串 这是一个.com程序,我使用的是86汇编程序 jmp start ; This will start the program ;============================ msg db "Hello Word.$" ; A string variable msg db "Michael J. Crawley$" ; A string variable with a value

我试图让我的程序在两行上显示一个字符串

这是一个.com程序,我使用的是86汇编程序

jmp start               ; This will start the program

;============================

  msg   db  "Hello Word.$"      ; A string variable 
  msg   db  "Michael J. Crawley$"   ; A string variable with a value.

;============================

start:

  mov ah,09             ; subfunction 9 output a string

  mov dx,offset msg         ; DX for the string

  int 21h               ; Output the message

  int 21h               ; Output the message

exit:

  mov ah,4ch
  mov al,00             ; Exit code 

  int 21h               ; End program

味精的两种定义?

以下是您的具体问题:

  • 您定义了两次
    msg
    (a86会在上面呕吐)
  • 您使用相同的msg值调用int21 fn9,因此您不打印这两条消息,只打印第一条消息的两个副本
  • 这两条消息中都没有换行符,因此它们将彼此相邻,而不是在单独的行上
这些问题的解决方案(不提供实际代码)

  • 将第二条消息标记为
    msg2
  • 在第二次调用int21之前,将
    msg2
    加载到dx中
  • 将消息更改为在“$”符号(或至少在第一个符号)之前添加换行符

更新:由于其他一些有用的灵魂已经提供了源代码,这里是我的解决方案。我建议您从中学习,并修改自己的代码来做类似的事情。如果你为了上课而从公共网站一字不差地复制它,你几乎肯定会被发现剽窃:

         jmp start                   ; This will start the program

msg      db  "Hello Word.",0a,"$"    ; A string variable .
msg2     db  "Michael J. Crawley$"   ; A string variable with a value.

start:   mov ah,09                   ; subfunction 9 output a string
         mov dx,offset msg           ; DX for the string
         int 21h                     ; Output the message
         mov dx,offset msg2          ; DX for the string
         int 21h                     ; Output the message
exit:
         mov ah,4ch
         mov al,00                   ; Exit code 
         int 21h                     ; End program
这将产生:

Hello Word.
Michael J. Crawley

我不熟悉a86,但是对于NASM&MASM,您需要在com程序开始时使用“ORG100H”汇编指令。按照现在的方式,偏移量msg是0x2,它将尝试从程序段前缀的第二个字节(一个16位的字,用于保存可用内存顶部的段)打印出来。

代码有什么问题?它“编译”吗?你得到奇怪的输出吗?最好再补充一句,我不太明白。我应该删除一个。。。。db“Michael J.Crawley$”;一个带值的字符串变量。@Mike:不,每个变量都需要唯一的名称。您可以将第一个“msg”替换为“msg1”,第二个替换为“msg2”。DOS int21调用是否也会在AX中返回结果代码,因此必须在第二个调用之前重新加载?或者DOS只是设置了进位标志来表示错误。@Michael,不是fn9,它什么也不返回。不是。。。我不是那种复制粘贴的人,我真的很想学这个。我试试。0a是字符串的位置吗?@Mike,0a是换行符(ASCII 10)的十六进制代码。int21/fn9将其解释为一个请求,以下拉到一个新行的开头。这就是为什么a86如此优秀,为什么Harald如此傲慢:-)它将汇编一个文件,而不需要其他汇编程序所需的任何gumpff-我一直讨厌masm,并且它要求我必须提供25行administrivia来做一个5行hello世界计划。Turbo Assembler拿走了很多,但a86一直在使用。