2017-05-22 5 views
-3

나는 C++ 및 어셈블리를 사용하여 하이브리드 프로그램을 작성해야합니다. 주요 기능은 C++로 작성되었습니다. 어셈블리로 작성된 함수는 float 배열 요소를 추가합니다. 나는 intiger 숫자를 사용하여 그것을 할 아무런 문제가 없었지만 그것은 부동 소수점 숫자를 사용하여 많이 달라 보입니다. 여기조립품. 잡종 programm. "나누기 오류"및 아무것도 나누지 않습니다.

코드입니다 :

PROC fun 

    push bp 
    mov bp, sp 
    push cx 
    push esi 
    push ebx 

     mov cx, word ptr [bp+12] ; array size 
     mov [bp-8], ecx 
     mov esi, dword ptr [bp+8] ; array 
     mov ebx, 0 


     fld dword ptr [ebx] 
p: 
     fld dword ptr [esi] 
     fadd 
     add esi, byte ptr 8 
     loop p 


     fst dword ptr [eax] 

     pop esi 
     pop cx 
     pop ebx 
     mov sp, bp 
     pop bp 

ret 
ENDP 

문제는 내을 programm를 실행하는 경우는 "분할 오류"를 반환하고 내가 어떤 부문을 사용하지 않는다는 것입니다 : | 누군가 나를 도울 수 있습니까?

+1

'mov ebx, 0' /'fld dword ptr [ebx]'무엇을 기대 했습니까? – Michael

+1

그리고 왜 주소에 16 비트와 32 비트 레지스터를 혼합하고 있습니까? (예 :'[bp + 12] vs [esi]') – Michael

+2

** C++ ** 코드가 표시되지 않습니다. –

답변

-1

발신자가 설정하는 방법을 알지 못해도 말하기 어렵습니다. 그러나 최선의 방법은이 코드를 통해 자신의 길을 디버깅하고 올바른 작업을 확인하는 동안 한 단계 씩 실행하여 잘못 된 부분을 정확하게 파악하는 것입니다. 또한 [bp - 8]에 대한 참조가 잘못된 것처럼 보입니다. 스택 처리가 잘못된 경우 손상된 스택을 반환하면 0으로 나누기가 발생할 수 있습니다. 어셈블러가 잘못 될 경우, 주변의 다른 코드의 메시지는 거의 의미가 없습니다. 새로운 어셈블러를 통해 초기 동작을 관찰하고 평가하기 위해서는 항상이 단계를 수행해야합니다.

+1

답변보다 댓글이 더 많이 들림 –

+0

그는 0으로 나누기 오류가 어디서 왔는지 묻고있었습니다. 나는 이런 종류의 일을 진행하는 방법에 대한 조언과 함께 그것을 설명했다. 이것은 초보자 질문 이었지만, 우리는 모두 거기에 있었고 정중하고 합법적 인 대답을 받아야한다고 생각했습니다. 이 사람을 두드리는 것은 우리 모두를 감소시킵니다. –