如何在程序集中打印两次字符串

时间:2016-01-13 19:06:45

标签: string assembly x86 dos

我是大会新人,所以这可能是一个菜鸟问题。如何在一行中打印两次字符串。我有这个代码,但它只打印一次。这是一个家庭作业,但我不想作弊,我只是想知道我的代码有什么问题。

dosseg
.model small
.stack
.data
     prompt1 db 13,10,"Enter a String: $"   
     prompt2 db 13, 10, "$"
     str1 db 30 dup("$")
.code
main proc
  mov ax,@data
  mov ds,ax
  mov es, ax

  lea dx,prompt1                
  mov ah,09h
  int 21h

  mov byte ptr str1, 30     
  mov dx, OFFSET str1
  mov ah,0ah
  int 21h

  lea dx,prompt2                
  mov ah,09h
  int 21h

  mov SI, 0002                  
  lea dx, str1[SI]
  int 21h
  int 21h

  mov ax,4c00h
  int 21h

main endp
end

1 个答案:

答案 0 :(得分:0)

打印两次,但两份副本重叠。 int21/0a将使用CR字符 终止输入缓冲区(不要问为什么),当打印时只将光标移回到行的开头,但是没有前进到下一行。您可以在它们之间打印另一个换行符:

  mov SI, 0002                  
  lea dx, str1[SI]
  int 21h

  lea dx, prompt2                
  int 21h

  lea dx, str1[SI]
  int 21h

重新阅读你的问题,你似乎想在同一行上打印两次。在这种情况下,请删除尾随的CR

movzx si, byte ptr [str1+1]   ; the length
mov byte ptr [str1+si+2], '$' ; chop off CR
lea dx, [str1+2]
int 21h
int 21h