ASM51, ako by ste nakodovali?

MK info@mcu.cz
Neděle Leden 22 17:06:53 CET 2006


> tak nic, myslel som ze rutinu "CASE" maju borci co programuju v
> asembleri dobre zvladnutu. Tak sa idem trapit a skusim nieco nakodit :-/

Balu promin, ale pokud vim, tak jsi dostal jiz dva navody jak to spachat a 
pritom se jedna o elementarni zaklad, ktery se s  oblibou uci na nasuch 
prohnilych  strednich skolach :-)))))) Neco obdobneho by snad mel prumerny 
doktor pres potrubi zvladnout, ne :-)))))


V pripade nesouslednych hodnot je vhodne zretezene porovnani ala

if  then
else if then
else uf then
....
else

coz je realizovatelne velice jednoduse pomoci
cjne  a, #x0, next1
jmp xx_0

next1:
cjne  a, #x1, next2
jmp xx_1

next2
cjne  a, #x2, next2
jmp xx_2

next1:
............................

pripadne variant pomoci JZ, JNZ a SUBB (pozor XRL neovlivmuje Z flag)
rotace a JC, JNC pripadne co Te jen napadne :))))


Nebo pro sousledne hodnoty primo
switch (x) of{
case 1:
case 2:
.....
}

coz se necha jednoduse realizovat pomoci rozskokove tabulky

rr A
rr A
mov DPTR, #tab
jmp @A+DPTR

kde
tab: je tabulka s adresami skoku

nebo muzes pouzit na prvni pohled slozitejsi, ale DPTR nevyuzivajici (zase 
zabere misto na stacku)

mov     A,xxx        ; kterou rutinou mame pokracovat ????
anl     A,#01111110B
mov     B3,A
add     A,#tab-$-2
movc    A,@A+PC
push    ACC             ; Lo(Adr)  a ulozime ji na vrchol STACKu
mov     A,B
add     A,#tab-$-3
movc    A,@A+PC
push    ACC             ; Hi(Adr)
 ret                     ; a skocime tam

kde
tab: je opet tabulka adres prislusnych rutin

Kdy pouzit co je jiz na Tvem zvazeni a Tvych schopnostech.

S pozdravem
MK






Další informace o konferenci Hw-list