2014-11-11 6 views
1

이 코드의 목적은 INC 카운터가 사용 된 횟수를 나타내는 숫자 아래에 "hello World"라는 제목을 표시하는 것입니다. 이 코드를 실행하면 MS DOS에서 문자 스트링이 그 아래에 문자 K (숫자가 필요함)로 표시됩니다. 부수적으로, 레지스터 D는 사용할 수 없으며 할당 된 메모리 위치는 899입니다. 그래서 기본적으로 프로그램을 실행할 때마다 숫자 대신 문자 (또는 다른 임의의 문자)를 얻는 이유를 알아내는 데 도움이 필요합니다. . 내 문제는 첫 번째 INT 21 이후이지만 100 % 확실하지는 않습니다. 가능하다면 나는 이것에 대한 약간의 의견과 아마 정정을 원할 것이다. 여기 내 코드는 다음과 같습니다x86 어셈블리 (카운터 표시 방법)

debug 
a100 
MOV cL, 02 
MOV AL, [0899] 
MOV BL, [0900] 
SUB AL, BL 
MOV BL, 0 
JGE 115 
INC BL 
ADD AL, CL 
JMP 10D 
MOV [0899], AL 
MOV DX, 054B 
MOV AH, 09 
INT 21 
ADD BL, 30 
MOV CL, BL 
MOV AH, 02 
INT 21 
INT 20 

e 054B "Hello World" 0d 0a "$" 

g=100 
+0

인쇄 할 것으로 예상되는 것은 무엇입니까? 숫자를 얻기 위해 30 시간을 추가하는 방법은 한 자리 숫자 (예 : 0..9)에서만 작동합니다. 숫자가> = 10 인 경우 10으로 나누고 나머지 30h를 출력해야합니다. – Michael

답변

1

INT 21 FN 02 레지스터 DL의 ASCII 문자 (하지BL 또는 CL)를 기대하고있다. DL은 'K'에 대한 ASCII 코드 인 MOV DX, 054B에서 4Bh로 설정되었습니다.

INT 21h의 올바른 사용을 확인하려면 Ralf Brown's Interrupt List을 제안합니다. INT 21 FN 02에 대한 설명은 "Int 21/AH = 02h"에서 찾을 수 있습니다.

알아두기 : 의 모든 숫자는 16 진수입니다. 0899는 십진수 2201이고 0900은 십진수 2304이며, 0899 이후에는 089A (0900이 아님)가옵니다.

[0899]와 [0900]의 초기 값을 알 수없고 아무 것도 없다고 생각됩니다. "Hello ..."와 같은 방법으로 초기화 할 수 있습니다. - 문자열 :

e 899 5 
e 900 10 
+0

그래서 어떤 인터럽트가 가장 유용합니까? 레지스터 BL을 CL이 아닌 다른 레지스터로 옮길 수는 있지만 MOV CL, BL을 MOV DL, BL로 변경하면 다른 문자를 얻게됩니다. 그리고 귀하의 링크를 확인했지만 어셈블리 언어로 시작한 이래로 INT 21h 중 어떤 형식을 사용해야하는지 확신 할 수 없습니다. – alex786

+0

@ alex786 : 내 업그레이드 된 답변을 살펴보십시오. – rkhb