» Poradna » Programy

Assembler 8086 deleni

 |   | 

dosseg model small stack 100h .data vysl db 4 dup(0) .code mov ax, @data ; ponechano schvalne, tady zbytecne mov ds, ax ;--------------------------vlastni deleni--------------------deleni: mov AX,7h mov BX,3h ;navraceni naseho AX pro pocitani, velmi dulezita hodnota mov si, offset vysldiv BX;--------------------------Konec vlastni deleni--------------------kokos: mov bh,ah and ah,11110000B shr ah,1 shr ah,1 shr ah,1 shr ah,1 cmp ah,0ah js cislo11 add ah,7hcislo11:add ah,30h mov [si],ah inc si and bh,0fh cmp bh,0ah js cislo12 add bh,7hcislo12:add bh,30h mov [si],bh inc si mov bl,al and al,11110000b shr al,1 shr al,1 shr al,1 shr al,1 cmp al,0ah js cislo13 add al,7hcislo13:add al,30h mov [si],al inc si and bl,0fh cmp bl,0ah js cislo14 add bl,7hcislo14:add bl,30h mov [si],bl mov bh,24h inc siMam tento jednoduchy program na deleni, ale misto vysledku mit o napise preteceni pri deleni, nevite jak to odstanit, diky mov [si],bhkonec: mov dx,offset vysl ;vysledek mov ah,09h int 21h mov ah,4chint 21hend

Odpovědi na otázku

 |   | 

pred delenim jeste vynuluj dx... deli se 64bitove cislo (ax,dx) 32bitovym... pokud se vysledek nevejde do 32bitu nebo se deli nulou, hodi to tuhle chybu

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

a co to vlastne ma delat? to delis 7/3 a hexadecimalne vypises?

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Dovolil jsem si to mirne zjednodusit... tohle by melo delat vicemene to same dossegmodel smallstack 100h.datavysl db 4 dup(0),"$"Num2HexTable db "0123456789ABCDEF".code mov ax,@data mov ds,ax; Deleni 7/3 xor dx,dx mov ax,7 mov bx,3 div bx; prevod do hexa mov si,offset vysl xor bx,bx mov cx,404hNum2HexLoop: rol ax,cl mov bl,al and bl,0fh mov bl,[Num2HexTable+bx] mov [si],bl inc si dec ch jnz Num2HexLoop; Napsani vysledku mov dx,offset vysl mov ah,09h int 21h; konec mov ah,4ch int 21hend

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

nebo takhle... o malinko rychlejsi, ale mozna trosku neprehlednejsidossegmodel smallstack 100h.datavysl db 4 dup(0),"$"Num2HexTable db "0123456789ABCDEF".code mov ax,@data mov ds,ax mov es,ax; Deleni 7/3 xor dx,dx mov ax,7 mov bx,3 div bx; prevod do hexa cld mov dx,ax mov di,offset vysl mov bx,offset Num2HexTable mov cx,404hNum2HexLoop: rol dx,cl mov al,dl and al,0fh xlat stosb dec ch jnz Num2HexLoop; Napsani vysledku mov dx,offset vysl mov ah,09h int 21h; konec mov ah,4ch int 21hend

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Naco pouzivas na rotaciu CL? Mozes pouzit konstantu....; prevod do hexacldmov dx,axmov di,offset vyslmov bx,offset Num2HexTablemov cx,4 ; budu 4 hexa cifryNum2HexLoop:rol dx,4 ; rotuj o 4bitymov al,dland al,0fhxlatstosbloop Num2HexLoop ; dalsia hexa cifra...

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

az od 80286

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

hele parada, mohl by jsi mi jeste napsat kdyz mam v DX naky data jak je prevedu do pameti zbytek, diky

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

to jsem nak nepochopil, hold uz je asi pozde jestli chces ukladat do pameti podobne jako treba v pascalu, tak si muzes vytvorit promennou v .datadw promenna ? ; dw znamena 16bitova data, db 8bitova, ? ze se to nijak neinicializujea s tou pak pracovatmov promenna,dx ; promenna:=dxmov dx,promenna ; dx:=promenna

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

pardon, "promenna dw ?"

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

dalsi moznosti je ukladat na zasobnikpush dx ; hodnota dx se ulozi na vrchol zasobniku...pop dx ; z vrcholu zasobniku se veme jedna hodnota a ulozi se do dx

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

jo nechci ztratit data v AX

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Pouzi push a pop.BTW. Ten prevod na hex mozes dat do procedury, vo vacsom programe to mozno budes potrebovat volat viackrat z roznych miest.V procedure si na zaciatku ulozis (push) registre ktore nechces aby procedura zmenila, a na konci obnovis (pop)Prip. mozes pouzit u deklaracii funkcie klucove slovo USES a registre ktore chces aby sa uchovali, prekladac urobi potrebne push/pop za teba. Vo fcii mozes pouzivat aj lokalne premenne (myslim ze ich alokuje prekladac zo stacku (mov ebp,esp a sub esb,_velkost_), a pristupuje k nim pomocou [ebp+_offset_]).

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

preklep, "sub esp,_velkost_", a "[ebp-_offset_]"

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

ve ok, jen bez tech "e" na zacatku... tj. sp a bp... neni to pro 80386, ale jen pro 8086

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Me to nejak neslape, muzete sem hodit pls zdrojak, kdyz mam v DX data trebas 0005 abych je dstal do pameti "zbytek" to cislo muze byt i 0244, diky diky moc

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Ani to do pameti strkat nemusis, zbyva jeste par nevyuzitych registru Jinak by stacilo dat po deleni "push dx" a pak si to vyzvednout pomoci "pop dx".dossegmodel smallstack 100h.dataNum2HexTable db "0123456789ABCDEF"DeleniText db "Vysledek deleni je "DeleniVysledek db "0000h, zbytek "DeleniZbytek db "0000h.",10,13,"$".codemov ax,@datamov ds,axmov es,ax; Deleni 7/3xor dx,dxmov ax,7mov bx,3div bx; prevod do hexamov di,offset DeleniVysledekmov si,axcall Num2Hexmov di,offset DeleniZbytekmov si,dxcall Num2Hex; Napsani vysledkumov dx,offset DeleniTextmov ah,09hint 21h; konecmov ah,4chint 21h; Num2Hex; Vstup:; si ... cislo; di ... kam ulozit vysledek (4 znaky); es, ds ... datovy segment; Vytup:; di ... ukazuje za posledni znak vysledku; ax,bx,cx ... nedefinovanoNum2Hex:cldmov bx,offset Num2HexTablemov cx,404hNum2HexLoop:rol si,clmov ax,siand al,0fhxlatstosbdec chjnz Num2HexLoopretend

Souhlasím  |  Nesouhlasím  |  Odpovědět

Související témata: Assembler, Offset, Kokos, Stack


Určitě si přečtěte

Filmové pirátství asi jen tak nezmizí. Když už musíte, stahujte bezpečně v Seedru

Filmové pirátství asi jen tak nezmizí. Když už musíte, stahujte bezpečně v Seedru

** Máme HBO Go, máme Netflix... ** Ale stejně krademe filmy a seriály ** Když už musíte, stahujte torrenty bezpečně v Seedru

Jakub Čížek | 141

20 let nám vědci slibují revoluční baterie, ale revoluce se pořád nekoná

20 let nám vědci slibují revoluční baterie, ale revoluce se pořád nekoná

** Technologie baterií se stále zlepšuje, ale žádné revoluce se nekonají ** Nejpopulárnějším typem baterií je Li-ion ** Efektivní baterie se stávají důležitější s příchodem elektromobilů

Karel Javůrek | 101

Porovnání deseti cloudových disků: kam a za kolik uložit 100 GB, 1 TB a 10 TB dat?

Porovnání deseti cloudových disků: kam a za kolik uložit 100 GB, 1 TB a 10 TB dat?

** Zjistili jsme, kam do cloudu nejvýhodněji uložíte data ** Vytvořili jsme žebříček cen deseti cloudových úložišť ** Ceny se liší - často i velice výrazně!

Karel Kilián | 105


Aktuální číslo časopisu Computer

Megatest televizí do 25 000 Kč

Nejlepší herní klávesnice

Srovnání správců hesel

Jak upravit fotky pro tisk