汇编输出(我没有得到)

Assembly output (I did not get it)

我想在屏幕上打印单个字符串computer

但我的输出显示字符串两次,如下所示:

 computercomputer

我的代码:

data segment   
mesaj db "computer$"
ends
stack segment
dw   128  dup(0)
ends
code segment
start:
mov ax,@data
mov ds,ax
call ekransil
lea dx,mesaj    
call yaz
yaz proc
mov ah,09
int 21h
ret
yaz endp
ekransil proc ;create procedur
mov ax,0600h
mov bh,74h
mov cx,0000h
mov dx,184fh
int 10h
ret
ekransil endp
int 20h
end start ;finish program

为什么数据段中的值显示打印了两次?我不明白。谁帮帮我。

这条指令之后要执行的下一条指令是什么call yaz?将执行以下指令

mov ah,09
int 21h
ret

因此你得到了 2x 'computer' 个单词。在这一行 call yaz 之后,你应该在程序或 ret 调用的末尾跳转。

你看到了吗?

 call ekransil
 lea dx,mesaj    
 call yaz         
 ; next instructions to execute are below
 yaz proc
   mov ah,09
   int 21h
   ret
 yaz endp

要避免重复显示您的字符串,您可以执行以下操作之一:

通常方式:

call yaz 之后添加 jmp exit 然后在 end start 之前添加这些行:

exit:
      mov ah, 04ch ; exit the program
      int 21h      ; and return the control to your OS

首选方式:

或者您可以像这样在退出代码之后放置两个过程的定义:

mov ah, 04ch     ; exit
int 21h          ; code 

yaz proc         ; definition of first procedure 
    mov ah,09
    int 21h
    ret
yaz endp

ekransil proc     ; definition of second procedure
    mov ax,0600h
    mov bh,74h
    mov cx,0000h
    mov dx,184fh
    int 10h
    ret
ekransil endp       

end start         ; finish program

请注意,在首选版本中,我们不必 jmp 标记 exit 并定义它。它比前者更受欢迎,因为它使您的程序看起来不那么混乱,并且您可以将过程的所有定义与主过程(开始)分开。此外,它对调试非常有帮助。

干杯 Ahtisham :)