2014-04-06 3 views
-1

어셈블리 문자를 문자로 읽고 배열에 저장 한 다음 문자 단위로 인쇄하는 프로그램을 만들려고합니다. 인터럽트를 사용하여 문자열을 읽고 인쇄 할 수 있지만 자세한 내용을 보려면 자체 코드를 원한다는 것을 알고 있습니다. 당신은 아주 조금 잘못한문자열 읽기 및 인쇄 - 어셈블리

buff dw 0,0,0,0,0,0 
len equ 5 

mov ah, 1 
mov si, 0 

read: 
         
     mov al b.buff[si] 
     int 21h 
     inc si 
     cmp si, len 
     jl read 
     jmp print 
     
mov si, 0 
mov ah, 2 
    
print: 

     mov dl, b.buff [si] 
     int 21h 
     inc si 
     cmp dl, 0 
     je end 
     jmp print 
     
end: 
+0

그리고 질문/문제는 무엇입니까? – m0skit0

+0

내가 뭘 잘못 했니? – user3500017

+0

http://stackoverflow.com/help/how-to-ask – m0skit0

답변

1

:

코드는 읽을 수 있지만,이 인쇄되지 않는 이유를 알고하지 않습니다. 기분 나빠하지 마라. 아무도이 물건을 알고 태어난다.

1) 사용중인 어셈블러를 알려주지 않습니다. 그들은 다르다! (아마도 Eric Isaacson의 a86처럼 보입니다.)

2) 버퍼가 "word"로 선언되었지만 "바이트"로 사용하고 있습니다. 이것은 아마도 많은 해를 끼치 지 않을 것입니다.

3) 버퍼가 "데이터"섹션에 있어야합니다. 버퍼를 실행하려고합니다. 이것은 당신을 아주 심하게 망칠 수 있습니다.

4) "읽기"루프에서 버퍼의 0을 al에 넣은 다음 문자 (al)를 읽고 아무 ​​것도하지 않습니다! 이것은 두 가지 "큰"문제 중 하나입니다. 당신의 "읽기"루프의 끝에서

5), 당신은 ah에 제로로드 2 si을 다시 두 줄 뛰어 ... 그래서 당신은 여전히에 인쇄되지, "읽기"(그리고있어 버퍼의 의도하지 않은 위치). 이것은 다른 "큰"문제입니다.

6) "print"루프는 0으로 끝나는 문자열을 필요로합니다. "읽기"루프의 끝에서 문자열을 명시 적으로 종료하지 마십시오. 버퍼에는 0이 미리 채워져 있으므로 피해가 없지만 그렇게 할 수도 있습니다.

7) "end"가하지 않으면 (어셈블러에 따라 다름) DOS (int 21h/4Ch)로 깨끗하게 종료하지 마십시오.

더 많을 수도 있지만 더 가까워 야합니다.