Klávesnice zdarma Klávesnice zdarma
Pořádné programy s pořádnou klávesnicí zdarma. Více zde
Pouze tento týden sleva až 80 % na C# .NET
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
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  +1 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.