2013-07-25 3 views
0

저장 옵션을 선택하면 내 앱이 작동하지 않습니다. 버그는 어디에 있습니까?왜 내 프로그램이 성공적이지 않습니까?

[bits 16] 
    [org 0x7d00] 

    ;Start 
start: 
    mov ah,00 
    mov al,03h 
    int 10h 
    mov ax,0a00h 
    mov es,ax 
keys: 
    mov ax,10h 
    int 16h 
    cmp al,'1' 
    je new 
    cmp al,'2' 
    je load 
    jmp keys 
new: 
    mov cx,1 
    mov dx,1 
    int 10h 
    mov ax,0013h 
    int 10h 
.key: 
    pusha ;save regs 
    mov ax,10h 
    int 16h 
    cmp al,' ' 
    je .draw_pix 
    cmp al,'w' 
    je .up 
    cmp al,'s' 
    je .down 
    cmp al,'a' 
    je .left 
    cmp al,'d' 
    je .right 
    cmp al,'q' 
    je start 
    cmp al,'e' 
    je save 
    cmp al,'c' 
    je clear 
    cmp al,'r' 
    je load 
    cmp al,'p' 
    je save 
    jmp .key 
    ;--------------------- 
.draw_pix : 
    popa 
    mov ah,0x0C 
    int 10h 
    jmp .key 
    ;--------------------- 
.up: 
    popa 
    dec dx 
    jmp .key 
    ;--------------------- 
.down: 
    popa 
    inc dx 
    jmp .key 
    ;--------------------- 
.left: 
    popa 
    dec cx 
    jmp .key 
    ;--------------------- 
.right: 
    popa 
    inc cx 
    jmp .key 
    ;--------------------- 
.inccolor: 
    popa 
    inc al 
    jmp .key 
    ;--------------------- 
.deccolor: 
    popa 
    dec al 
    jmp .key 
    ;--------------------- 
load: 
    ;.... 

clear: 
    mov ax,0013h 
    int 10h 
    jmp keys 
save: 
    mov cx,0 
    mov dx,0 
.read: 
    add [Buffer],cx 
    add [Buffer],dx 
    add [Buffer],al 
    mov ah,0x0D 
    int 10h 
.getx: 
    cmp cx,319 
    je .gety 
    inc cx 
    jmp .read 
.gety: 
    cmp dx,199 
    je start 
    inc dx 
    mov cx,0 
    jmp .read 

exit: 
    ret 

Buffer times 512 dw 0 

나는 왜 이것이 멈추지 않았는가? 기능을 저장하십시오. 반드시 픽셀을 읽고 버퍼를 작성해야합니다 : X, Y, Color하지만 항상 중단됩니다. 내 os.에서 이것을 시도했습니다. 고마워요.

+3

없음 공격하지만 당신은 당신의 코드를 구성하는 경우에만 문제가 것 중 하나하지 존재하거나 쉽게 발견 될 수있다. 'save'는 실제로 당신이 암시 한 것 이외의 것을합니다. 그것은'cx'와'dx'에 0을 넣고'.read','.getx','.gety'를 거쳐 결국 전체 프로그램을 다시 시작합니다 ('je start'). 또는 단순히 멈추게됩니다. '.get'->'.gety' "루프"에서. 너 뭐하려고? – Powerslave

+2

서브 루틴은 점프되지 않지만 호출됩니다. x86에서 서브 루틴을 호출하고 코드를 수정하는 방법을 배웁니다. 또한 주석 처리를하면 주석 처리되지 않은 어셈블리를 읽지 않을 것입니다. – m0skit0

+0

픽셀 페인트를 사용하고 있지만 실제로 작동하고 있다고 생각합니까? – Srs

답변

2

서브 루틴을 사용하는 적절한 방법은 (예를 들어 전용) :

mySubroutine: 
    push bp 
    mov bp,sp 

    mov ax,[ss:bp + 4] ; load first parameter into AX 
    mov bx,[ss:bp + 6] ; load second parameter into BX 

    ; do work here 

    mov sp,bp 
    pop bp 
ret 

; ... 

; push parameters from right to left, invoke mySubroutine 
; and clean up stack afterwards 
mov ax,9 
push ax ; push the second parameter onto the stack 
mov ax,7 
push ax ; push the first parameter onto the stack 
call mySubroutine 
add sp,4 

추가 의견은 '초보자'힌트 '에 대한이 있고, 완전히 불필요하거나 라이브 전문 심지어 방해 유의하시기 바랍니다 코드

자세한 내용은 x86 calling conventions을 참조하십시오.

나는 각 서브 루틴의 상단에있는 "C 함수 서명 의견을 '추가와 함께 cdecl을을 권하고 싶습니다 :

; void print(char* text) 
_print: 
    push bp 
    mov bp,sp 

    ; ... 

    mov sp,bp 
    pop bp 
ret 
+0

고마워.하지만 물어볼 질문이 하나 있는데. 물어봐도 될까요? – Srs

+0

@ AbdulkadirÇakır 물론! 그게 * StackOverflow *에 대한 것입니다 :) – Powerslave

+0

나는이 버퍼를 hdd.do에 쓰기를 원한다고 생각합니다. 다른 에러가 발생합니까? 그리고 어떻게 필자의 필기 된 x, y, Color를 디코딩 할 수 있습니까? – Srs

관련 문제