8086机器语言:简单程序无法正常工作

时间:2018-09-24 23:29:46

标签: assembly nasm x86-16 dosbox emu8086

试图通过DOSBox通过NASM的机器语言显示我的名字和字符输入。这很简单,但是我在代码方面遇到了麻烦。我的代码在下面列出。

说明是要编写一个8086程序,该程序将:

  • 在一行上显示您的姓名
  • 在下一行上显示一个“?”
  • 从键盘上读取一个字符
  • 显示第二条消息和紧随ASCII字符序列的字符。

到目前为止,这是我的代码。出于某种原因,它无法正常工作,因为我缺少如何获取ASCII字符序列中后面的字符。

请告诉我我做错了什么吗?
如果我走的路正确?
以及如何读取新的ASCII字符?

这真是我的密码:

      org 100h
      section .data
      msg   DB "Name of Person"
      char  DB '?'
      char1 DB ' '
      msg2  DB 0dh, 0ah, 'The following character in sequence is:  '
      char3 DB ' ','$'
   section .text
  Start: 
      mov  dx, [msg]     ;get message
      mov  ah, 09h       ;display string function
      int  21h           ;display message
  ;input a character
      mov  ah, 1         ;read char fcn
      int  21h           ;input char into AL
      mov  [char1], al   ;store character
  ;display in same line 
      mov  dx, [char1]   ;read char1
      mov  ah, 1         ;display character
      int  21h           ;display message
   ;display on next line next character
      mov  dx, msg2      ;get last line message
      int  21h           ;display message
  Exit:
      mov  ah, 4Ch       ;DOS function: Exit program
      mov  al, 0         ;return exit code value
      int  21h           ;Call DOS. Terminate program

1 个答案:

答案 0 :(得分:2)

org 100h

ORG 100h指令指示您的目标是获取.COM程序。由于该任务要求使用简单程序,因此这是正确的选择。您无需担心初始化段寄存器,也不需要使用诸如.data.text之类的部分。您只需要注意一件事:如果在代码之前 放置数据(消息等),它们将被错误地执行!因此,最好将它们放在程序的最下方下方。那是一个安全的地方。

  

1 。在一行上显示您的姓名

mov  dx, [msg]     ;get message
mov  ah, 09h       ;display string function
int  21h           ;display message

对于此DOS输出功能,您需要在DX中提供一个地址。使用NASM汇编程序时,类似mov dx, [msg]的指令将提取存储在地址 msg 中的2个字节。在这种情况下,这不是您想要的!正确的说明是mov dx, msg,因此没有方括号
其次,此DOS输出功能希望消息以您未提供的美元符号 $ 结尾。

  

2 。在下一行上,显示“?”

您可以轻松地将其与输出您的姓名结合起来。参见下面的代码。

  

3 。从键盘上读取一个字符

您这样做很好。

  

4 。显示第二条消息,以及紧随其后的ASCII字符序列中的字符。

您只需通过递增在步骤 3 中获得的数字即可获得下一个ASCII字符。


由于这确实是一个非常简单的程序,因此几乎不可能不编写整个代码。
即使这样,您也可以从中学到很多。请注意以下额外注释。

org 100h

mov  dx, msg1
mov  ah, 09h       ;display string function
int  21h

mov  ah, 01h       ;read char function
int  21h           ;leaves char in AL
inc  al
mov  [char], al    ;store N E X T character 

mov  dx, msg2
mov  ah, 09h       ;display string function
int  21h

mov  ax, 4C00h     ;DOS function to exit program with return exit code value
int  21h

msg1  DB 'Dillon Shotwell',13,10,'?$'
msg2  DB 13,10,'The following character in sequence is: '
char  DB 0,13,10,'$'
  • DOS输入功能01h已经在屏幕上打印了字符(称为echo),因此重复此操作没有用。
  • 因为第二条消息的终止 $ 被放置在递增的 char 后面,所以整个事情是通过一次调用DOS函数09h来输出的。
  • 用回车/换行符结束最后一条消息肯定更好。
  • 尝试避免编写多余的注释。他们使阅读和理解程序变得更加困难。
  • 只要可能,就可以将mov ah, 4Chmov al, 0之类的操作组合在一起,就像mov ax, 4C00h一样容易编写。随附的注释将对其进行足够的澄清。