2013-06-05 2 views
-1

나는 현재 NASM을 배우고 있으며, 이동과 덧셈을 통해 사용자 입력 변수를 곱하는 간단한 프로그램을 만들고있다.NASM 스택 오류? 간단한 곱셈 프로그램

저는 여러 가지 문제에 직면 해 있습니다. 내 피승수는 어떤 이유로 든 단어가 가질 수있는 최대 데이터 값으로 주어집니다. 또한, 내 대답은, 프로그램이 그렇게 해야하는 경우, 거의 항상 잘못된 알고리즘입니다 (비록 내 알고리즘이 정확하다고해도!).

extern printf 
extern scanf 

section .data 
    message: db "Enter your multiplicand: " 
    message_L: equ $-message 
    message2: db "The number you entered is: %d ", 10, 0 
    message2_L: equ $-message2 
    message3: db "Enter your multiplier: " 
    message3_L: equ $-message3 
    message4: db "Your multiplier is: %d ", 10, 0 
    message4_L: equ $-message4 
    message5: db "The product of this multiplication is: %d ", 10, 0 
    mesasge5_L: equ $-message5 
    fmt1: db "%d", 0 

section .bss 
    multiplicand: resw 1 
    multiplier: resw 1 
    product: resw 1 

section .text 
    global main 
scanInt: 
    push ebp 
    mov ebp, esp 
    sub esp, 2 
    lea eax, [ebp-2] 
    push eax 
    push dword fmt1 
    call scanf 
    mov ax, word[ebp-2] 
    mov esp, ebp 
    pop ebp 
    ret 

main: 
    xor eax, eax 
    xor ebx, ebx 
    xor ecx, ecx 
    xor edx, edx 

    mov eax, 4 
    mov ebx, 1 
    mov ecx, message 
    mov edx, message_L 
    int 80h 

     call scanInt 
     mov word[multiplicand], ax 
    mov word[product], ax 

    jmp print1 
main2: 
    mov eax, 4 
    mov ebx, 1 
    mov ecx, message3 
    mov edx, message3_L 
    int 80h 

    call scanInt 
    mov word[multiplier], ax 

    jmp print2 
main3: 
    mov ax, word[multiplicand] 
    jmp check 
check: 
    cmp word[multiplier], 2 
    jz printAnswer 
    ror [multiplier], 1 
    shl word[multiplier], 1 
    jc carry 
    shr word[multiplier], 1 
    shr word[multiplier], 1 
    shl word[product], 1 
    jmp check 

carry: 
    add word[product], ax 
    shr word[multiplier], 1 
    clc 
    jmp check 

endLoop: 
    mov eax, 1 
    mov ebx, 0 
    int 80h 

printAnswer: 
    push ebp 
    mov ebp, esp 
    push word[product] 
    push dword message5 
    call printf 
    add esp, 12 
    mov esp, ebp 
    pop ebp 
    jmp endLoop 

print1: 
    push ebp 
    mov ebp, esp 
    push dword[multiplicand] 
    push dword message2 
    call printf 
    add esp, 12 
    mov esp, ebp 
    pop ebp 
    jmp main2 

print2: 
    push ebp 
    mov ebp, esp 
    push dword[multiplier] 
    push dword message4 
    call printf 
    add esp, 12 
    mov esp, ebp 
    pop ebp 
    jmp main3 
+2

왜 여기 코드를 입력하지 않으시겠습니까? 우리 회사 방화벽이 나를 붙여 넣을 수는 없어요. > 8v ( –

+2

그것은 올바르게 작동합니까? 구체적으로 무엇이 잘못 되었습니까? – wallyk

답변

1

나는 귀하의 주된 문제는 word 변수를 사용한다고 생각합니다. 스택에 2 바이트 버퍼를 만들고 그것에 scanf을 호출하면 거의 확실하게 문제가 발생합니다. word을 32 비트 코드로 푸시하는 것은 "합법적"이지만 문제를 일으킬 수 있습니다. 한 예로, printf에 두 개의 변수를, add esp, 12을 나중에 호출합니다. 그들 모두를 dword로 만들고 스택 조작을 4 바이트 덩어리로 유지하십시오. 나는 그것이 당신의 문제의 대부분을 치료할 것이라고 생각합니다. 명시 적으로 높은 수준, 버퍼 I/O, 낮은 수준의 기능 (printf, scanf, fopen(), fread(), fwrite() 등으로 기능이 높은 수준의 기능, open(), read(), write()을 혼합하지 제안

매뉴얼 페이지 .. 시스템 호출은 저수준 함수입니다). 이 문제로 인해 문제가 발생하지는 않으나 이상한 결과가 발생할 수 있습니다. 예를 들어, printf은 버퍼가 플러시 될 때까지 아무 것도 인쇄하지 않습니다. 줄 바꿈으로 끝내거나 다른 상위 I/O 기능을 사용하면 버퍼가 비워집니다. 예를 들어 sys_read은 그렇지 않습니다. 나는 둘 중 하나를 고수 할거야.

행운을 빈다.