试图通过DOSBox通过NASM的机器语言显示我的名字和字符输入。这很简单,但是我在代码方面遇到了麻烦。我的代码在下面列出。
说明是要编写一个8086程序,该程序将:
到目前为止,这是我的代码。出于某种原因,它无法正常工作,因为我缺少如何获取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
答案 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,'$'
echo
),因此重复此操作没有用。mov ah, 4Ch
和mov al, 0
之类的操作组合在一起,就像mov ax, 4C00h
一样容易编写。随附的注释将对其进行足够的澄清。