2014-12-01 4 views
1

안녕하세요 저는 assembly language을 배우기 시작했습니다. 나는 그것이 가지 노력하고, 입력을하려고하지만 난 그것을 인쇄하려고 할 때 적절한 문자열을하지 않는기본 입력 어셈블리 언어

.MODEL SMALL 
.STACK 1000H 
.DATA 
MSG db "Hey$" 
.CODE 
MAIN PROC 
    MOV AX, @DATA 
    MOV DS, AX 

    MOV AH,0AH ; setting the sub function 
    MOV DX, offset msg ; moving address of msg to dx 
    INT 21h  ; calling interrupt 

    MOV AH, 09 
    MOV DX, OFFSET MSG 
    INT 21h  ; for printing 

    MOV AH, 04Ch ; Select exit function 
    MOV AL, 00 ; Return 0 
    INT 21h  ; Call Interupt to Terminate program 
MAIN ENDP 
END MAIN 

:

나는 다음과 같은 코드를 썼습니다. 이 list을 사용하여 인터럽트 기능을 선택했습니다. 내가 스크린 샷을 첨부하고

는, 내가 입력을 다음과 같은 문자열을 준 :

Hey this is me taking input 

하지만 예기치 않은 결과를 얻었다.

스크린 샷 :

enter image description here

질문 :

  • 은 내가 잘못 여기서 뭐하는 거지?
  • 어셈블리 프로그램을 작성할 때 사용할 훌륭한 디버거가 있습니까?
  • 좋은 어셈블리 자습서에 대한 링크는 매우 좋을까요?

감사합니다.

+0

'0a'는 입력 버퍼를 반환합니다. 바이트 0 = 최대 문자 버퍼가 보유 할 수있는 바이트 1 = 마지막 입력의 문자 수, 바이트 2+ = 실제 문자. 메타 데이터 바이트를 포함하여 전체 버퍼를 덤프하는 것입니다. –

+0

0과 바이트 1, 바이트 2+를 각각 어떻게 처리 할 수 ​​있습니까? –

+2

오프셋 msg + 2를 사용하십시오. 기본적으로 –

답변

0

입력 문자열에 충분한 공간을 두지 않았습니다. MSG을 "신고"하면 4 자리 ("Hey$")의 공간 만 부여했습니다.

+0

어떻게하면됩니까? –

0

http://www.skynet.ie/~darkstar/assembler/intlist.html

참고 : "데시벨 크기 DUP (0)"우리가 바이트 크기의 양의 값을 점유 할 수와 함께.

.MODEL SMALL 
.STACK 10H 
Size = 3 
.DATA 
M1 db Size   ; First character=max length 
M2 db ?    ; Second char of buffer=length of input 
MSG db Size dup (20H) ; Rest of buffer=input string 
    db 0DH   ; followed by carriage return (0Dh) 
;--- 
    db "$"   ; (allways needed for printing function) 
.CODE 
MAIN PROC 
MOV AX, @DATA 
MOV DS, AX 

MOV AH,0AH  ; setting the sub function 
MOV DX, offset M1 ; moving address of input buffer 
INT 21h   ; calling interrupt 

MOV AH, 09 
MOV DX, OFFSET MSG 
INT 21h   ; for printing 

MOV AH, 04CH  ; Select exit function 
MOV AL, 00  ; Return 0 
INT 21h   ; Call Interupt to Terminate program 
MAIN ENDP 
END MAIN