根据这个定义message db "Hello, DOS Here!", 0dh, 0ah
,接下来的代码将打印完整的消息:
mov ah, 02h
mov dl, message ;Get the H character
int 21h
mov dl, message+1 ;Get the e character
int 21h
mov dl, message+2
int 21h
mov dl, message+3
int 21h
mov dl, message+4
int 21h
mov dl, message+5
int 21h
mov dl, message+6
int 21h
mov dl, message+7
int 21h
mov dl, message+8
int 21h
mov dl, message+9
int 21h
mov dl, message+10
int 21h
mov dl, message+11
int 21h
mov dl, message+12
int 21h
mov dl, message+13
int 21h
mov dl, message+14
int 21h
mov dl, message+15
int 21h
mov dl, message+16 ;Get the 0Dh carriage return
int 21h
mov dl, message+17 ;Get the 0Ah linefeed
int 21h
而是愚蠢,止跌”你说?
为了使用一个循环,并获得很多紧凑的代码,我们需要:
- 把你的邮件地址中的地址寄存器。您可以从
SI
,DI
,BX
和BP
中进行选择。我在下面的代码中选择了BX
。
- 在此地址读取一个字节。
- 用DOS输出字节。
- 递增地址寄存器中的指针。
- 通过检查您刚刚输出的换行符是否为所有文本重复步骤2,3,4,5。因为在你的文本中,这是最后一个字符。
一个版本的循环:
mov bx, OFFSET message ;1.
Again:
mov dl, [bx] ;2.
mov ah, 02h ;3.
int 21h
inc bx ;4.
cmp dl, 0Ah ;5.
jne Again
我也应该使用push和pop要能够打印字符串中的相同方法,但倒退。
为了实现你的这个下一个任务,你会放一个push dx
在步骤2和3之间。然后写一个额外的循环来显示反转的字符串:
Again2:
pop dx
mov ah, 02h
int 21h
cmp dl, "H"
jne Again2
的陷阱在这里将这
- 你不应该输出之前,其他(实际)字符换行和回车==>提示:在开始第二循环
前做2个
pop
小号
- 你不能轻易认为“H”将只显示为文本的第一个字符==>提示:算
push
小号
数你有机会获得一个调试器?第一步是了解它为什么要输出字符9C。调试器可以帮助解决这个问题。问问你自己是否每次都做同样的事情,以及它从哪里获得“9C”。 –
请参阅[Ralf Brown中断列表](http://www.ctyme.com/intr/int-21.htm)。如果这看起来是一项家庭作业,那么正确的做法是刷完笔记并最终在办公时间访问。 :)你的代码显示了缺乏x86汇编语言的基础,我相信你不想在整个研究过程中拖动它。 –
不知道你的意思是你的最新评论玛格丽特,但我正在尽我所能进一步了解我的材料。这只是我掌握的许多资源之一。就像生活中的其他事情一样,从各个角度得到建议总是很好的。你永远不知道谁有一招或两个袖子!感谢Moby的建议。我相信这将是处理这种语言的重要工具。它实际上是非常深入的(只要我已经阅读了足够的能够理解它......在这一点上工作)。 – Rifleman192