Pomoc z pętlą w asemblerze


(Maleckrystian) #1

Mam taki kod w c++

void main(){

int i,j,m,n,suma;

float z;

suma=0;

cout<<"Podaj liczbe naturalna m\n";

cin>>m;

cout<<"Podaj liczbe naturalna n\n";

cin>>n;

for(i=1;i<=n;i++){

z=m/i;

suma=suma+ceil(z);

}

cout<<"Wynik to: "<

system("pause");

}

muszę go napisać w asemblerze

napisałem takie coś

TITLE sprawozdanie z zad 16 list 2

.386

.model flat,stdcall

.stack 1024

.data

m DWORD 5d

n DWORD 8d

suma DWORD ?

.code

main PROC

mov ecx,n

L1:

mov eax,m

div ecx

mov ebx,suma

add ebx,ecx

loop L1

main ENDP

END main

skompiluje ale kiedy dochodzę do dzielenia wyskakuje błąd związany z overflow

jak mogę to poprawić ?


(Rolek0) #2

Dzielną jest liczba 64bitowa w rajestrach edx:eax, natomiast iloraz musi się zmieścić w 32 bitach eax.

Jeśli interesują cię tylko dolne 32 bity dzielnej to powinieneś przed dzieleniem wyzerować edx (przy dzieleniu bez znaku), np. xor edx,edx

Natomiast gdybyś dzielił ze znakiem (idiv) to przed dzieleniem powinieneś użyć cdq do "rozciągnięcia" znaku liczby z eax na edx.