装配输出(我没有得到它)

时间:2017-12-17 16:26:43

标签: assembly microprocessors emu8086

我想在屏幕上打印一个字符串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

为什么数据段中显示的值会打印两次?我不明白。有人帮助我。

2 个答案:

答案 0 :(得分:1)

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

mov ah,09
int 21h
ret

因此你得到2x'计算机'字样。在此行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

答案 1 :(得分:1)

为避免两次显示字符串,您可以执行以下操作之一:

通常方式:

jmp exit之后添加call yaz,然后在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并对其进行定义。它优先于前者,因为它使您的程序看起来不那么混乱,并且您将所有程序的定义与主程序(start)分开。此外,它对调试非常有帮助。

Cheers Ahtisham:)