2016-08-05 3 views
1

키보드에서 입력 문자열을 가져와 다시 표시하려고합니다. 왜 메시지가 두 번 표시되는지 알 수 없습니다. 예를 들면 : 당신의 문자열을 입력 : 1234567 가 출력 될 것어셈블리 가져 오기 문자열을 입력하십시오.

귀하의 입력 : 1234567 귀하의 입력 :

내가 두 번을 얻고있다 이유가 궁금합니다. 난 당신이 문자열로 끝 마커를 추가하려는 mov si+sev, '$' 라인과 가정

data segment 
prompt db 0dh,0ah,"Enter your string(7 Chars Max): $" 
nam  db 8 dup(?) ; 7 plus term char $ 
msg1 db 0dh,0ah,"Your input: $" 
sev db 7 dup(?) 
data ends 
code segment 
assume cs:code,ds:data 
START: 
mov ax,data 
mov ds,ax 
mov dx,offset prompt 
mov ah,09h 
int 21h 
lea si,nam 
mov cx,7 
et:mov ah,01 
int 21h 
mov [si],al 
inc si 
loop et 
mov si+sev,'$' 
mov dx,offset msg1 
mov ah,09h 
int 21h 
lea dx,nam 
mov ah,09h 
int 21h 
mov ah,4ch 
int 21h 
Code ends 
end Start 
+2

'mov si + sev,'$ ''는 당신이 원하는 것을하지 않을 가능성이 큽니다. 왜 단지'mov [si] ','$ ''가 아닌가? –

+0

@SamiKuhmonen이 맞습니다.'[si] '루프가 이미 문자열의 끝을 가리키고 있기 때문에'+ sev'는 필요 없습니다. –

+2

또한 'sev'는 7과 같지 않습니다. 또 다른 7 바이트 메모리 블록이므로'si '에 오프셋을 추가하면 매우 어딘가를 가리 킵니다 –

답변

2

: 여기 내 코드입니다. sev은 7 바이트의 또 다른 메모리 블록이므로 오프셋을 si에 추가하면 완전히 다른 곳을 가리키고 문제를 일으킬 수 있기 때문에 이것은 올바르지 않습니다.

값을 읽고 각각 si을 증가시킬 때마다 mov [si], '$'을 사용하여 마지막 문자 읽기 후에 끝 마커를 쓸 수 있습니다.