동일한 기능 번호 02h를 갖지만 DL
레지스터에 완전히 다른 정보를 수신 할 것으로 예상되는 2 개의 시스템 기능을 끔찍하게 섞어서 현재 프로그램이 실패합니다. DOS OutputCharacter 함수는 문자 코드를 필요로하며 48으로 설정하지만 BIOS SetCursor 함수는 열과 동일한 값인 48을 해석합니다. 그래서 결과가 화면 중간에 표시됩니다!
프로그램 시작시 거의 항상 화면의 왼쪽 가장자리에있는 현재 커서 위치부터 시작하기 때문에 커서 위치를 전혀 설정할 필요가 없습니다.
mov ah, 02h
mov dl, "0"
Next:
push dx ;Preserve current character
int 21h
mov dl, " " ;Your desired output shows this space?
int 21h
mov dl, 10 ;Linefeed moves the cursor 1 line down
int 21h
pop dx ;Restore current character
inc dl
cmp dl, "9"
jbe Next
대신 별도의 카운터를 사용하여, 당신은 증가 DL
레지스터의 값을보고 다시 반복에 대해 결정할 수 있습니다. 당신이 CX
레지스터에 따라 달라집니다 loop
명령을 사용하지만, 당신은 단지 그것의 CL
하단을 초기화하는 것이
공지 사항! 이것이 종종 프로그램 충돌의 원인입니다.
편집
도스 박스는 캐리지 리턴 문자 (10)를 표시하도록 요청하면 줄 바꿈이, 내가 정확성에 대한 시험이 다음 작은 프로그램을 작성 (this comment by Michael Petch 내 관심을 끌게) 모두 방출 점을 감안 최신 DOSBox 버전은 0.74 버전입니다.
ORG 256 ;Create .COM program
mov ah, 02h ;DOS.DisplayCharacter
mov dx, "0" ;DH is spaces counter, DL is current character
jmps First ;Character "0" has no prepended spaces!
Next:
push dx ;(1)
mov dl, " "
Spaces:
int 21h
dec dh
jnz Spaces
pop dx ;(1)
First:
int 21h ;Display character in DL
push dx ;(2)
mov dl, 10 ;Only on DOSBox does this do Carriage return AND Linefeed !
int 21h
pop dx ;(2)
add dx, 0201h ;SIMD : DH+2 and DL+1
cmp dl, "9"
jbe Next
mov ax, 4C00h ;DOS.TerminateWithExitcode
int 21h
프린트 캐리지 리턴 및 개행 (CR + LF, ASCII 10, 13) 우선,이 다음 행의 첫 번째 위치로 커서를 이동 – Tommylee2k
그 또는 원시 옵션 대 조리가있는 경우. pc/dos world cooked에서 0x0A가 0x0D 0x0A로 변환된다는 것을 의미합니다. 그렇지 않으면이 sys 호출에 대해 사용자 자신이 직접 수행해야합니다. 직접 호출해야합니다. –