2016-06-01 5 views
1

지금은 어셈블리에서 원을 그리려하고 있지만 어떤 이유로 작동하지 않으며 DOSBox가 멈추고 이유를 이해하지 못하는 것 같습니다. 또한 원이 화면에 나타나지 않습니다. 나는 대부분의 코드를 온라인에서 발견했으며 그것을 사용하려고 노력하고 있으며 그것이하는 일을 이해하고 있지만 여기서 실수를 발견 할 수는 없다. 도움이 사람에게조립 - 원 그리기

player1disccolor db 0Eh 
Player1Disc: 
    push 0a000h 
    pop es     
    mov dx, 20    
    mov di, 20    
    mov al, [player1disccolor]    
    mov bx, 30     
    call Player1Disc  
    mov ah, 0 
    int 10h      
    mov bp,0     
    mov si,bx     

Disc1:     
    call Set8pixels        
    sub bx,bp    
    inc bp     
    sub bx,bp     
    jg Disc2     
    add bx,si     
    dec si     
    add bx,si    

Disc2:     
    cmp si,bp    
    jae Disc1     
    ret 

Set8pixels:   
    call Set4pixels    

Set4pixels:   
    xchg bp,si    
    call Set2pixels    

Set2pixels: 
    neg si 
    push di 
    add di,si 
    add di,dx 
    mov [es:[di+bp]],al 
    sub di,bp 
    stosb 
    pop di 
    ret 

감사 : 여기

는 코드입니다. 이 마지막 명령 call Player1Disc 코드와

+1

에 의해 주어진 추락 이유를? –

+0

이 코드를 발견 한 페이지에 대한 링크를 게시 할 수 있습니까? –

+0

어셈블러에 대해 배우고 싶다면 팔과 같은 최신 CPU를 선택하십시오. 훨씬 더 좋고 프로그램하기 쉽습니다. 에뮬레이터와 대부분의 휴대 전화가 있으며 라스베리 파이에는이 CPU가 있습니다. (나는 x86을 약 5 대 1로 팔아 버렸다고 생각한다.) –

답변

3

Player1Disc: 
    push 0a000h 
    pop es     
    mov dx, 20    
    mov di, 20    
    mov al, [player1disccolor]    
    mov bx, 30     
    call Player1Disc 
재귀 하고 유용한 아무것도하지 않고 자신을 호출 끝없이입니다! 이것은 필연적으로 프로그램을 망칠 것입니다.


위의 오류가 AL 레지스터가 제대로 설정되지 않았기 때문에 다음 2 개 라인은 정의되지 않은 모드로 비디오 모드를 설정합니다이되지 않은 경우에도!

mov ah, 0 <= This is the BIOS SetVideoMode function 
int 10h 
+0

Fifoernik에 도움을 주셔서 감사합니다. AL 레지스터가 제대로 설정되지 않은 이유와 Player1Disc 기능을 어떻게 중지시킬 수 있는지 이해할 수 없습니까? 내가 아는 유일한 방법은 그것을 무언가와 비교하는 것이고 나는이 경우에 그것을 사용할 수 있다고 생각하지 않는다. – KatomPower

+4

@KatomPower : 지시 사항이 무엇인지 잘 모르는 것 같아요. 예를 들어'int 10h'가 BIOS 서비스를 호출하는 것처럼, "아"는 BIOS가 어떤 종류의 서비스를 요구하는지, 나머지 레지스터는 필요에 따라 서비스마다 설정되어야한다고 말합니다. es = 0xA000에서 320x200 256 색 모드에 관심이 있다고합니까? 'mov ax, 13h int 10h'는 그것을 할 것입니다 (아 = 0 [선택 gfx 모드], al = 19 [320x200 256color BIOS gfx 모드] ...'ax'는'al'과'ah' 둘 모두로 구성됩니다. 레지스터들 때문에 하나의'mov'에 의해 양쪽 모두를 설정합니다,'al'은 하위 8 비트 부분입니다) – Ped7g

0

the other forum에서 찾은 프로그램으로 수행 한 작업을 이해하지 못합니다.
이것은 내가 거기에서 복사 한 것입니다. 될 수있는 것처럼 간단합니다.

.MODEL TINY 
.286 
.CODE 
    ORG  100h 
Start: 
    mov  ax,13h 
    int  10h     ;mode 13h 
    push  0a000h 
    pop  es     ;es in video segment 
    mov  dx,160    ;Xc 
    mov  di,100    ;Yc 
    mov  al,04h    ;Colour 
    mov  bx,50    ;Radius 
    call  Circle    ;Draw circle 
    mov  ah,0 
    int  16h     ;Wait for key 
    mov  ax,3 
    int  10h     ;Mode 3 
    mov  ah,4ch 
    int  21h     ;Terminate 

;*** Circle 
; dx= x coordinate center 
; di= y coordinate center 
; bx= radius 
; al= colour 
Circle: 
    mov  bp,0    ;X coordinate 
    mov  si,bx    ;Y coordinate 
c00: 
    call  _8pixels   ;Set 8 pixels 
    sub  bx,bp    ;D=D-X 
    inc  bp     ;X+1 
    sub  bx,bp    ;D=D-(2x+1) 
    jg  c01     ;>> no step for Y 
    add  bx,si    ;D=D+Y 
    dec  si     ;Y-1 
    add  bx,si    ;D=D+(2Y-1) 
c01: 
    cmp  si,bp    ;Check X>Y 
    jae  c00     ;>> Need more pixels 
    ret 
_8pixels: 
    call  _4pixels   ;4 pixels 
_4pixels: 
    xchg  bp,si    ;Swap x and y 
    call  _2pixels   ;2 pixels 
_2pixels: 
    neg  si 
    push  di 
    add  di,si 
    imul  di,320 
    add  di,dx 
    mov  es:[di+bp],al 
    sub  di,bp 
    stosb 
    pop  di 
    ret 
END Start 

은 당신의 자신의 버전은 완전한 절차를 유지하고 call Circle로 전화를 해결하려면. 또한 Circle 절차 내에서 ES 세그먼트 레지스터를 설정하는 것이 좋습니다. 이는 더 강력한 방법입니다.

Player1Disc: 
    mov dx, 20     ;CenterX 
    mov di, 20     ;CenterY 
    mov al, [player1disccolor] ;Color    
    mov bx, 30     ;Radius 
    call Circle 
    ... 
    ALL THE OTHER CODE YOU NEED 
    ... 
Circle: 
    push 0A000h 
    pop es     
    mov bp, 0     
    mov si, bx 
    ... 

디버거로 코드를 단계별로 시도 해 봤나 원래 코드가 이미 Fifoernik