2017-11-20 16 views
0

어셈블리에서 대각선 방향으로 0-9를 표시하려하지만, 출력은 대각선으로 인쇄 된 숫자를 창 중간에 배치합니다.숫자를 대각선으로 인쇄하십시오.

start: 
mov ah, 02h 
mov cl, 0Ah ;counter (10) 
mov dx, 02h 
;mov bx, 02h 
mov dl, 30h ;start printing 0-9 
mov dh, 02h ;start row 
mov al, 02h 
int 21h 

again: 

int 10h 
int 21h 
;add dx, 01h 
inc dh 
inc dx 
inc al 

loop again 
mov ax, 4c00h 
int 21h 

출력이어야 :

0 
    1 
    2 
     3 
     4 
      5 
      6 
       7 
       8 
        9 

전류 출력 인쇄,하지만 창의 중간 여기

코드이다. 나는 새 레지스터 bh을 추가하고 파일을 실행할 때 커서를 현재 위치에 놓으려고했습니다. 커서에서 시작하여 어떻게 표시 할 수 있습니까? 루프와 증가 레지스터에 넣어야합니까 ah?

+1

프린트 캐리지 리턴 및 개행 (CR + LF, ASCII 10, 13) 우선,이 다음 행의 첫 번째 위치로 커서를 이동 – Tommylee2k

+0

그 또는 원시 옵션 대 조리가있는 경우. pc/dos world cooked에서 0x0A가 0x0D 0x0A로 변환된다는 것을 의미합니다. 그렇지 않으면이 sys 호출에 대해 사용자 자신이 직접 수행해야합니다. 직접 호출해야합니다. –

답변

2

동일한 기능 번호 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 
+1

질문에 DOSBox가 태그되었습니다. 만약 당신이 그 환경에서 그것을 시험해 본다면 (DOSBox 에뮬레이터를 사용하여) 궁금 할 것입니다. 내가 아는 한, DOSBox는 Line Feed를 CRLF (디자인상의 결점)로 인쇄 할 것이므로이 대답은 대각선으로 인쇄되지 않을 것입니다. DOS의 실제 버전을 실행할 때 (물론 DOSBox에서도) 코드가 작동합니다. –

+0

@MichaelPetch 당신 말이 맞아요. 방금 직접 테스트 해본 결과, DOSBox의 경우 10은 분명히 13 + 10을 의미합니다. 나는 새로운 해결책을 추가하고 이번에 그것을 확인했다! –