我对x86-16位编程很陌生。我很困惑如何正确地调用函数2,以便从字符串中单独读取字符。如果有人有任何想法的话,我们将不胜感激。下面的代码显示了我当前的尝试(多个尝试之一)。
.model small
.data
message db "Hello, DOS Here!", 0dh, 0ah
.code
main proc
mov ax, @data
mov ds, ax
L1:
mov ah, 2
mov bx, 1
int 21h
loop L1
.EXIT
main endp
end main我还应该使用push和pop来打印相同方法的字符串,但可以向后打印。我肯定我漏掉了一些显而易见的东西。印上几行的英镑符号我就知道了。(12月: 156;十六进制: 9C)
发布于 2017-09-30 12:21:34
使用此定义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。这个循环的一个版本:
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来打印相同方法的字符串,但可以向后打印。
要完成您的下一个任务,您需要在步骤2和步骤3之间放置一个push dx。然后编写一个额外的循环来显示反向字符串:
Again2:
pop dx
mov ah, 02h
int 21h
cmp dl, "H"
jne Again2这里的陷阱是
poppush的数目发布于 2017-09-26 16:58:35
警告:我已经几十年没有这样做了,我面前也没有一个编译器能做到这一点。这看起来像一个作业,所以我不会写代码,但我会指出正确的方向。
Int 21h函数2要求您将dl设置为要输出的字符。这里不需要推送和弹出,因为DOS不使用堆栈传递参数。首先,在循环之外,您希望将寄存器指向消息的地址,类似于:MOV si, message。然后,您需要从消息中删除单个字节,并将其放入dl中。这将需要使用间接地址表示法。然后,您可以调用中断21h并写出字符。
至于循环,有几种方法可以接近它。您可以使用计数器,使用cx作为典型的寄存器,并使用LOOP语句或DEC和JNZ语句。或者,您可以在字符串的末尾放置一个标记,并在单击该标记时终止循环。此操作通常使用空字符。您还需要移动到字符串中的下一个字符。您可以通过添加索引或增加si寄存器的值来实现这一点。有点像INC si
尽管如此,有一种更容易避免循环的方法,但可能是作弊。看看中断21h功能9
发布于 2017-09-26 22:19:01
是的,使用功能9将是‘作弊’,因为它是其他练习之一(这是很容易的)。我已经修改了我的代码,并让它从开始字符开始。我只需要弄清楚如何让它继续循环,这样它就可以继续读取字符串,而不是任意停止。到目前为止,我得到的是(打印H和15E):
.model small
.data
message db "Hello, DOS Here!"
.code
main proc
mov ax, @data
mov ds, ax
mov ah, 2
mov cx, 16
mov dl, message
L1:
int 21h
mov dl, message + 1
loop L1
.EXIT
main endp
end mainhttps://stackoverflow.com/questions/46431682
复制相似问题