2

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

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

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
4

3 回答 3

3

以下是您的具体问题:

  • 您定义msg了两次(a86 会对此表示反对)。
  • 您使用相同的 msg 值调用 int21 fn9 ,因此您不会将两条消息打印出来,而只是打印第一条的两个副本。
  • 您在任何一条消息中都没有换行符,因此它们将彼此邻接,而不是在不同的行上。

这些点的解决方案(不提供实际代码)。

  • 将第二条消息标记为msg2
  • msg2在第二次调用 int21 之前加载到 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
于 2010-02-12T04:29:09.107 回答
1

msg的两个定义?

于 2010-02-12T04:21:17.457 回答
0

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

于 2010-02-12T04:47:14.010 回答