Využij akce až 30 % zdarma při nákupu e-learningu. Více informací. Zároveň je tento týden sleva až 80 % na e-learning týkající se C# .NET
Hledáme nového kolegu do redakce - 100% home office, 100% flexibilní pracovní doba. Více informací.
Avatar
Caster
Člen
Avatar
Caster:15.5.2018 17:51

V ASM potřebuji zjistit, zda je číslo X Signed Integer (double word) mezi dvěma hodnotami A, B, kde A<B viz část zjednodušeného kódu:

cmp X, B
jg Dale ; X > B
cmp X, A
jl Dale ; X < A
nop ; A<=X<=B
Dale:

Nejsem si jistý, že to bude fungovat na záporná i kladná čísla. Například:

X = -20500 (0FFFFAFECh)
A = -20000 (0FFFFB1E0h)
B = -21000 (0FFFFADF8h)

a

X = 7
A = 4
B = 9

 
Odpovědět
15.5.2018 17:51
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Caster
Martin Dráb:16.5.2018 0:17

V druhém případě je A < X < B.

V prvním případě je B < X < A.

Takže je správně, že kód dává jiné výsledky. Jinak myslím, že pokud na nop mají skončit případy A <= X <= B, tak ten kód je dobře.

Nahoru Odpovědět
16.5.2018 0:17
2 + 2 = 5 for extremely large values of 2
Avatar
Caster
Člen
Avatar
Odpovídá na Martin Dráb
Caster:16.5.2018 0:53

Přišel jsem na to, že instrukce pro porovnání dvou čísel neumí pracovat s různými znaménky. Vyřešil jsem převedením záporných hodnot zeměpisné šířky na kladnou hodnotu a přičtením 90. Např. LAT -34,528 bude 124,528. Po vynásobení 1 000 pak 124 528 v celočíselném tvaru.

 
Nahoru Odpovědět
16.5.2018 0:53
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Caster
Martin Dráb:16.5.2018 1:10

Na jakých číslech ti tvůj kód nepracuje správně? Dej konkrétní příklad.

Nahoru Odpovědět
16.5.2018 1:10
2 + 2 = 5 for extremely large values of 2
Avatar
Caster
Člen
Avatar
Odpovídá na Martin Dráb
Caster:16.5.2018 1:30

Třeba hned ten úvodní příklad, kdy by mělo X projít. Instrukce výše fungují správně pouze pro všechna čísla kladná. Snažit se porovnat kombinace čísel s různými znaménky by byla šílenost (i když mě zprvu nenapadlo, že signed integer lze použít pouze pro standardní aritmetické operace).

 
Nahoru Odpovědět
16.5.2018 1:30
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Caster
Martin Dráb:16.5.2018 1:35

Tak, ty instrukce provádějí standardní aritmetické operace, nic víc a nic méně. Je třeba ale nezapomínat na to, že i když 2 < 4, tak -2 > -4.

Reprezentace čísel v doplňkovém kódu je navržena právě tak, aby základní operace (sčítání, odčítání – a CMP vlastně provádí odčítání) fungovaly tak, jak by člověk čekal (tzn. že například -1 + 1 = 0).

Nahoru Odpovědět
16.5.2018 1:35
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.