装配打印一个字符串

时间:2013-01-05 12:10:21

标签: string assembly x86 dos

我在打印从键盘读取的字符串时遇到问题,如果字符串是最大长度然后它可以工作但是如果我只输入3个字符,例如我有一个空白的黑色空格,这就是代码:

assume cs:code,ds:data

data segment
    sir db 12 dup (?),'$'
    mesaj db "Who`s your daddy?",13,10,"$"
data ends

code segment
start:
    mov ax,data
    mov ds,ax
    mov dx,offset mesaj
    mov ah,09h
    int 21h
    mov bx,offset sir
    mov sir[0],11
    mov dx,bx
    mov ah,0ah
    int 21h
    mov dx,offset sir
    mov ah,09h
    int 21h
    mov ah,01h
    int 21h
    mov ax,4c00h
    int 21h
code ends

end start

1 个答案:

答案 0 :(得分:0)

如果您将sir db 12 dup (?), '$'更改为sir db 12 dup('$'),'$',并将mov dx, offset sir更改为mov dx, offset sir + 2,而不是其他人在评论中建议的那样,那么您的代码应该有效。

但是,如果您想清楚地看到结果,则需要打印一些换行符。

这是因为0ah例程(字符串输入):

  1. 回显您对终端的输入,包括按Enter键时选择的回车符(0dh),但不包括将光标移动到的换行符(0ah)下一行

  2. 将所有输入(包括回车)放在指定的内存位置,但不再换行。

  3. 这意味着在输入例程运行后,光标会立即位于您在上输入的行的开头,它仍然包含您的回显输入。因此,在执行任何其他操作之前,请打印换行符以使其转到下一行。

    接下来,当您输出字符串时,拾取最后的回车符并将光标返回到行的开头,但同样没有换行符。之后(通过您的程序或系统上的任何其他程序)写入的内容很可能会覆盖您打印的内容。因此,再次打印换行符,使其首先进入下一行。

    打印换行符应该简单如下:

    data segment
    ....
        lf db 10, '$'
    ....
    
    code segment
    ....
        mov dx, offset lf
        mov ah, 9
        int 21h
    ....
    
        mov dx, offset lf
        mov ah, 9
        int 21h
    ....