%include "rw32-2018.inc" section .data delenec dq 300000000101 delitel dd -3 ; pro vypis, pozor -- platforme zavisle! fmt db "Vysledek: %lld, zbytek: %d",EOL,0 CEXTERN printf section .text CMAIN: ; Ukol: podelit 64b [delenec] / 32b [delitel] ; Problem: vysledek se nemusi vejit do 32b registru ; Upozorneni: pouzity postup muze byt (je) suboptimalni a prepisuje vstupy! ; (1) prevedeme vstupy na kladne cisla xor esi, esi ; priznak kladneho delence xor edi, edi ; priznak kladneho delitele mov edx, [delenec+4] test edx, edx jns .kladny_delenec inc esi ; z delence spravime kladne cislo mov eax, [delenec] not eax not edx add eax, 1 ; inc nenastavuje carry! adc edx, 0 mov [delenec], eax mov [delenec+4], edx .kladny_delenec: mov eax, [delitel] test eax, eax jns .kladny_delitel inc edi neg eax mov [delitel], eax .kladny_delitel: ; (2) podelime vrchnich 32b, pozor na little endian mov eax, [delenec+4] mov edx, 0 ; edx:eax <- delenec div dword [delitel] ; eax <- podil, edx <- zbytek ; (3) podelime zbytek:spodnich 32b, musime zalohovat podil mov ecx, eax ; zaloha podilu do ecx mov eax, [delenec] ; spodni cast delence div dword [delitel] ; eax <- podil, edx <- zbytek ; celkovy vysledek: ecx:eax, celkovy zbytek: edx ; (4) opravime znamenka podilu a zbytku xor edi, esi jz .kladny_vysledek not eax not ecx add eax, 1 ; inc nenastavuje carry! adc ecx, 0 .kladny_vysledek: test esi, esi jz .kladny_zbytek neg edx .kladny_zbytek: ; volaci konvence jazyka C (funkce printf), cdecl push edx ; zbytek push ecx ; vrchni polovina podilu ecx:eax push eax ; spodni polovina podilu (bude na nizsi adrese protoze zasobnik roste smerem dolu) push fmt ; formatovaci retezec call printf add esp, 16 ; vyklideni zasobniku xor eax, eax ret