Curso de Assembly Frederico Lamberi Pissarra Atualização dos textos originais para UTF-8. Publicado originalmente no ano de 1!" na #ede $rasileira de Telem%tica $T' #e(isado em )8 de *ul+o de ),1
Prefácio
% /azem ), anos desde a primeira publicação dessa s0rie de artigos ue /oi c+amado de 23urso4" na #$T. 5u tin+a )6 anos de idade" tin+a um P3 com processador )8 e" uando aduiri um 789 !,:;z" escre(i sobre os registradores e no(as instruç
>5:$L5# e com o assembler in-line do PA>3AL e do $orland 3?? 7.1 &ue era o meu @5 pre/erido" na 0poca'. e l% para c%" muita coisa mudou •
•
•
•
•
•
•
•
Processadores de 1 bits estão limitados aos microcontroladores. ;% uase uma d0cada não ouço /alar do 8,8 ou o antigo )8B 3om o ad(ento da moderna aruiteura x8-! o uso de registradores de segmento &ou 2seletores4" como são c+amados desde o 78' tornou-se obsoleto C pelo menos D nE(el de aplicaçãoB =s compiladores 33?? tornaram-se tão poderosos ue desen(ol(er diretamente em assemblG 0 raramente praticadoB As modernas placas de (Edeo e os sistemas operacionais não possibilitam mais o acesso direto D memHria de (Edeo e ao c+ipset. Tudo tem ue ser /eito por bibliotecas como =penIL ou irect9B A aritim0tica de ponto-/ixo era uma alternati(a D lenta aritim0tica de ponto-/lutuante" ue era muito lenta. ;o*e" trabal+ar com 2/loats4 e 2doubles4 0 tão per/orm%tico uanto trabal+ar com aritim0tica inteiraB 5::78 não 0 usado +% muito tempoJ Ko(os con*untos de registradores estão disponE(eis para o desen(ol(edor em assemblG. esde Ds extens@: &>>5'" ue disponibiliza registradores para uso em ponto-/lutuante" e de /orma paralelaJ :ultit+reading 0 uma realidade" com 3PUs de multiplos 2cores4B
= 2curso4 a seguir 0 uma (el+aria. :as" ao ue parece" ainda a*uda muita gente a entender a base do assemblG. 5u penso nesses textos como documentos +istHricos...
Frederico Lamberti Pissarra 18 de março de ),1!
Conteúdo
Aula 1 &5mbasamento' Aula ) &Aritimetica bin%ria' Aula 7 egistradores Pil+a e Flags' Aula ! &@nstruçaltos' Aula &@nterrupç+i/ts' Aula 11 &:ais instruç3AL' Aula 17 &Usando assemblG em 3' Aula 1! &Usando o TU#$= A>>5:$L5#' Aula 16 &:ais TA>:' Aula 1 &5ntendendo o 5::78' Aula 1 &Usando o 5::78' Aula 18 &= processador 78' Aula 1 &strlen e strcpG em AssemblG' Aula ), &Aritim0tica em ponto-/ixo' Aula )1 &:exendo com a MIA' Aula )) &Latc+es e bitmasNs' Aula )7 &:exendo ainda mais na MIA' Aula )! &= modo de escrita 1 da MIA' Aula )6 &= modo de escria 7 da MIA' Aula ) &= modo de escrita ) da MIA'
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 01 ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra A linguagem ASSEB!" #e n$o assemblER%& d' medo em mui(a gen(e% S) n$o sei *or+ue% As liguagens di(as de ,al(o n-.el, s$o /T mais com*le2as +ue o assembly% *rogramador assembly (em +ue saber3 an(es de mais nada3 como es(' organi4ada a mem)ria da m'+uina em +ue (rabal5a3 a dis*onibilidade de ro(inas *r67de8inidas na R do micro #+ue 8acili(a mui(o a .ida de .e4 em +uando%& e os demais recursos +ue a m'+uina o8erece9 /ma grande des.an(agem do assembly com rela$o as ou(ras linguagens 6 +ue n$o e2is(e (i*agem de dados como3 *or e2em*lo3 *on(o78lu(uan(e999 *rogramador (er' +ue desen.ol.er as suas *r)*rias ro(inas ou lanar mao do co7*rocessador ma(em'(ico #o T/RB ASSEB!ER3 da Borland3 8ornece uma maneira de emular o co7*rocessador&9 N$o e2is(em 8un;es de en(rada7sa-da como PRNT do BASC ou o % 5e5e5e& Pra +ue ser.e o assembly en($o> A res*os(a 6: Para +ue .oc? *ossa desen.ol.er as suas *r)*rias ro(inas3 sem (er +ue (o*ar com bugs ou limi(a;es de ro(inas @' e2is(en(es na R7BS ou no seu com*ilador ,C,3 ,PASCA!, ou +ual+uer ou(ro999 Cabe a+ui uma considera$o in(eressan(e: mui(o mais *rodu(i.o usarmos uma liguagem de al(o n-.el @un(amen(e com nossas ro(inas em assembly999 E.i(a7se a ,rein.en$o da roda, e n$o (emos +ue desen.ol.er TAS as ro(inas necess'rias *ara os nossos *rogramas9 Em *ar(icular3 o assembly 6 mui(o =(il +uando +ueremos criar ro(inas +ue n$o e2is(em na liguagem de al(o7n-.el na(i.a% /ma ro(ina AS bem desen.ol.ida *ode nos dar a .an(agem da .elocidade ou do (aman5o mais redu4ido em nossos *rogramas9 *rimeiro *asso *ara comear a en(ender alguma coisa de assembly 6 en(ender como a CP/ organi4a a mem)ria9 Como no nosso caso a id6ia 6 en(ender os micro*rocessadores da 8am-lia 02D da n(el #*resen(es em +ual+uer PC7Com*a(-.el&3 .amos dar uma ol5adela no modelamen(o de mem)ria usado *elos PCs3 8uncionando sob o S7S #
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ odelamen(o REA! da mem)ria 7 A segmen(a$o ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ A mem)ria de +ual+uer PC 6 di.idida em segmen(os9 Cada segmen(o (em DIJ by(es de (aman5o #DKKLD by(es& e *or mais es(ran5o +ue *area os segmen(os n$o s$o organi4ados de 8orma se+uencial #o segmen(o seguin(e n$o comea logo a*)s o an(erior%&9 E2is(e uma sobre*osiao9 e uma ol5ada:
DIJ #(aman5o do segmen(o 0& MO M ┊ ┊ ┊ ┊ │ ┊ ┊ ┊ ┊ │ ┊ ┊ ┊ ┊ │ Q 0 1 G Numero dos segmen(os Q 1D 1D by(es by(es segundo segmen(o comea e2a(amen(e 1D by(es de*ois do *rimeiro9 eu *ra *erceber +ue o inicio do segundo segmen(o es(' ENTR do *rimeiro3 @' +ue os segmen(os (em DIJ de (aman5o%
Es(e es+uema biru(a con8unde bas(an(e os *rogramadores menos e2*erien(es e3 a(6 5o@e3 ningu6m sabe *or+ue a n(el resol.eu u(ili4ar essa coisa es+uisi(a9 as3 *aci?ncia3 6 assim +ue a coisa 8unciona% Para encon(rarmos um de(erminado by(e den(ro de um segmen(o *recisamos 8ornecer o FFSET #deslocamen(o3 em ingl?s& des(e by(e rela(i.o ao inicio do segmen(o9 Assim3 se +ueremos locali4ar o d6cimo7+uin(o by(e do segmen(o 03 bas(a es*eci8icar 0:1K3 ou se@a3 segmen(o 0 e o88se( 1K9 Es(a no(a$o 6 usada no res(an(e des(e e de ou(ros ar(igos9 Na realidade a CP/ 8a4 o seguin(e c'lculo *ara encon(rar o ,endereo 8-sico, ou ,endereo e8e(i.o, na mem)ria:
MO │ ENEREU7EFETV W #SEXENT Y 1D& Z FFSET │ Q lus(rando a com*le2idade des(e es+uema de endereamen(o3 *odemos *ro.ar +ue e2is(em di.ersas 8ormas de es*eci8icarmos um =nico ,endereo e8e(i.o, da mem)ria999 Por e2em*lo3 o endereo 0:1LA5 *ode ser (amb6m escri(o como: 00015:01GA5 000K5:00EA5 000\5:00AA5 0005:00DA5 00115:00GA5
000G5:011A5 000D5:00A5 000A5:00\A5 000E5:00KA5 001G5:001A5
000L5:010A5 000[5:00CA5 000B5:00A5 000F5:00IA5 001L5:000A5
000I5:00FA5 0005:00BA5 000C5:00[A5 00105:00LA5
Bas(a 8a4er as con(as +ue .oc? .er' +ue (odas es(as 8ormas dar$o o mesmo resul(ado: o endereo7e8e(i.o 001LA59 Xenerali4ando3 e2is(em3 no m'2imo3 1D 8ormas de es*eci8icarmos o mesmo endereo e8e(i.o% As =nicas 8ai2as de endereos +ue n$o (em e+ui.alen(es e s) *odem ser es*eci8icados de uma =nica 8orma s$o os desesseis *rimeiros by(es do segmen(o 0 e os =l(imos desesseis by(es do segmen(o 0FFFF59 Normalmen(e o *rogramador n$o (em +ue se *reocu*ar com esse (i*o de coisa9 com*ilador (oma con(a da mel5or 8orma de endereamen(o9 as3 como a (oda regra e2is(e uma e2cess$o3 a in8orma$o acima *ode
ser =(il algum dia9
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ A BASE N/RCA ]EHAECA! E BNARA #*ara os no.a(os999& ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ Alguns (al.e4 n$o (en5am con5ecimen(o sobre as demais bases num6ricas usadas na 'rea in8orma(a9 mui(o comum di4ermos ,c)digo 5e2adecimal,3 mas o +ue signi8ica> bas(an(e l)gico +ue usemos o sis(ema decimal como base *ara (odos os c'lculos ma(em'(icos do dia7a7dia *elo sim*les 8a(o de (emos E^ dedos nas m$os999 8ica 8acil con(ar nos dedos +uando *recisamos9 Com*u(adores usam o sis(ema bin'rio *or um ou(ro mo(imo sim*les: E2is(em a*enas dois n-.eis de (ens$o *resen(es em (odos os circui(os l)gicos: n-.eis bai2o e al(o #+ue s$o c5amados de 0 e 13 *or con.eni?ncia999 *ara *odermos medi7los sem (er +ue recorrer a um mul(-me(ro%&9 sis(ema 5e2adecimal (amb6m (em o seu lugar: 6 a 8orma mais abre.iada de escre.er um con@un(o de bi(s9 Em decimal3 o n=mero 1\\I3 *or e2em*lo3 *ode ser escri(o como: 1\\I W #1 Y 10_& Z #\ Y 10`& Z #\ Y 10& Z #I Y 10⁰ & No(e a base 10 nas *o(?ncias9 Fao agora uma *ergun(a: Como re*resen(ariamos o mesmo n=mer se (i.essemos 1D dedos nas m$os>
➠ Primeiro (eriamos +ue ob(er mais digi(os999 0 a(6 \ n$o s$o
su8icien(es9 Pegaremos mais D le(ras do al8abe(o *ara su*rir es(a de8iciencia9
➠ Segundo3 Tomemos como ins*ira$o um odme(ro #e+ui*amen(o
dis*on-.el em +ual+uer au(om).el 7 6 o medidor de +uilome(ragem%&: uando o algarismo mais a direi(a #o menos signi8ica(i.o& c5ega a \ e 6 incremen(ado3 o +ue ocorre>999 Re(orna a 0 e o *r)2imo 6 incremen(ado3 8ormando o 109 No caso do sis(ema 5e2adecimal3 is(o s) acon(ece +uando o =l(imo algarismo alcana F e 6 incremen(ado% e*ois do \ .em o A3 de*ois o B3 de*ois o C3 e assim *or dian(e999 a(6 c5egar a .e4 do F e sal(ar *ara 03 incremen(ando o *r)2imo algarismo3 cer(o>
Como con(ar em base di8eren(e de de4 6 uma si(ua$o n$o mui(o in(ui(i.a3 .e@amos a regra de con.ers$o de bases9 Comearemos *ela base decimal *ara a 5e2adecimal9 Tomemos o n=mero 1\\I como e2em*lo9 A regra 6 sim*les: i.ide7se 1\\I *or 1D #base 5e2adecimal& a(6 +ue o +uoe8icien(e se@a 4ero999 (oma7se os res(os e (em7se o n=mer con.er(ido *ara 5e2adecimal: MO ⇒ uocien(e W 1GI3 Res(o W 10 ⇒ 10WA │ 1\\I 1D │ ⇒ uocien(e W [3 Res(o W 1G ⇒ 1GWC │ 1GI 1D │ ⇒ uocien(e W 03 Res(o W [ ⇒ [W[ │ [ 1D │ Q Toma7se en($o os res(os de bai2o *ara cima3 8ormando o n=mero em 5e2adecimal9 Nes(e caso3 1\\IW[CA5
Acrescen(e um 5 no 8im do n=mero *ara sabermos +ue se (ra(a da base 1D3 do con(r'rio3 se ol5armos um n=mero ,[CA, *oderiamos associa7lo a +ual+uer ou(ra base num6rica #base oc(adecimal *or e2em*lo%&999 *rocesso in.erso3 5e2a f decimal3 6 mais sim*les999 bas(a escre.er o n=mer3 mul(i*licando cada digi(o *ela *o(?ncia corre(a3 le.ando7se em con(a a e+ui.alencia das le(ras com a base decimal: MO │ [CA5 W #[ Y 1D`& Z #C Y 1D& Z #A Y 1D⁰ & W │ │ #[ Y 1D`& Z #1G Y 1D& Z #10 Y 1D⁰ & W │ │ 1[\G Z 1\G Z 10 W 1\\I │ Q As mesmas regras *odem ser a*licadas *ara a base bin'ria #+ue (em a*enas dois digi(os: 0 e 1&9 Por e2em*lo3 o n=mero 1G em bin'rio 8ica: MO ⇒ uocien(e W D3 Res(o W 0 │ 1G G │ ⇒ uocien(e W L3 Res(o W 0 │ D G │ ⇒ uocien(e W 13 Res(o W 1 │ L G │ ⇒ uocien(e W 03 Res(o W 1 │ 1 G │ │ │ │ 1G W 1100b │ Q Cada digi(o na base bin'ria 6 con5ecido como BT #Binary digT 7 ou digi(o bin'rio3 em ingl?s&9 No(e o b no 8im do n=mero con.er(ido999 Faa o *rocesso in.erso999 Con.er(a 10100110b *ara decimal9 A .an(agem de usarmos um n=mero em base 5e2adecimal 6 +ue cada digi(o 5e2adecimal e+ui.ale a e2a(amen(e +ua(ro digi(os bin'rios% Faa as con(as: ua(ro bi(s *odem con(er a*enas 1D n=meros #de 0 a 1K&3 +ue 6 e2a(amen(e a +uan(idade de digi(os na base 5e2adecimal9
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 0G ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra ais alguns concei(os s$o necess'rios *ara +ue o *re(enso *rogramador ASSEB!" saiba o +ue es(' 8a4endo9 Em ele(rnica digi(al es(uda7se a algebra booleana e ari(im6(ica com n=meros bin'rios9 A+ui esses concei(os (amb6m s$o im*or(an(es999 Vamos comear *ela ari(im6(ica bin'ria: A *rimeira o*era$o b'sica 7 a soma 7 n$o (em mui(os mis(6rios999 bas(a recorrer ao e+ui.alen(e decimal9 uando somamos dois n=meros decimais3 e8e(uamos a soma de cada algarismo em se*arado3 *res(ando a(en$o aos ,.ai um, +ue ocorrem en(re um algarismo e ou(ro9 Em bin'rio 8a4emos o mesmo: MO │ 1010b Z 0110b W > │ │ │ │ 111 ,Vai uns, │ │ 1010b │ │ Z 0110b │ │ │ │ 10000b │ Q ra3 na base decimal3 +uando se soma 7 *or e2em*lo 7 \ e G3 8ica 1 e ,.ai um,999 Tomemos o e2em*lo do odme(ro #a+uele indicador de +uilome(ragem do carro&: 0\ f 10 f 11 En+uan(o na base decimal e2is(em 10 algarismos #0 a(6 \&3 na base bin'ria (emos G #0 e 1&9 odme(ro 8icaria assim: 00b f 01b f 10b f 11b Por(an(o3 1b Z 1b W 10b ou3 ainda3 0b e ,.ai um,9 A sub(ra$o 6 mais com*licada de en(ender999 Na base decimal e2is(em os n=meros nega(i.os999 em bin'rio n$o% #Veremos de*ois como ,re*resen(ar, um n=mero nega(i.o em bin'rio%&9 Assim3 1b 7 1b W 0b #l)gico&3 1b 7 0b W 1b #ou(ra .e43 e.iden(e%&3 0b 7 0b W 0b #5e5e999 .oc? de.e es(ar ac5ando +ue eu es(ou (e sacaneando3 n6>&3 mas e 0b 7 1b W >>>>> A solu$o 6 a seguin(e: Na base decimal +uando sub(raimos um algarismo menor de ou(ro maior cos(umamos ,(omar um em*res(ado, *ara +ue a con(a 8i+ue corre(a9 Em bin'rio a coisa 8unciona do mesmo @ei(o3 mas se n$o (i.ermos de onde ,(omar um em*res(ado, de.emos indicar +ue 8oi (omado um de +ual+uer 8orma:
MO │ 0b 7 1b W > │ │ │ │ 1 Tomamos esse um em*res(ado de algum lugar% │ │ 0b #n$o im*or(a de onde%& │ │ 7 1b │ │ │ │ 1b │ Q Esse ,1, +ue a*areceu *or m'gica 6 con5ecido como BRR<9 n=mero bin'rio maior bas(a usar o mesmo ar(i8icio:
Em um
MO │ 1010b 7 0101b W > │ │ │ │ 1 1 s ,1,s +ue 8oram (omados em*res(ados s$o │ │ 1010b sub(ra-dos no *ro2imo digi(o9 │ │ 7 0101b │ │ │ │ 0101b │ Q Faa a con(a: 0000b 7 0001b3 .ai acon(ecer uma coisa in(eressan(e% Faa a mesma con(a usando um *rograma3 ou calculadora cien(i8ica3 +ue mani*ule n=meros bin'rios999 resul(ado .ai ser ligairamen(e di8eren(e *or causa da limi(a$o dos digi(os su*or(ados *elo so8(are #ou calculadora&9 ei2o a conclus$o do ,*or +ue, des(a di8erena *ara .oc?999 #/ma dica3 8aa a con(a com os ,n, digi(os su*or(ados *ela calculadora e (er' a e2*lica$o%&9
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Re*resen(ando n=meros nega(i.os em bin'rio ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ /m ar(i8icio da algebra booleana *ara re*resen(ar um n=mero in(eriro nega(i.o 6 usar o =l(imo bi( como indicador do sinal do n=mero9 as3 esse ar(i8icio gera uma segunda com*lica$o999 !imi(emos esse es(udo ao (aman5o de um by(e # bi(s&999 Se o bi( [ #a con(agem comea *elo bi( 0 7 mais a direi(a& 8or 0 o n=mero re*resen(ado 6 *osi(i.o3 se 8or 13 6 nega(i.o9 Essa 6 a di8erena en(re um ,c5ar, e um ,unsigned c5ar, na linguagem C 7 ou um ,c5ar, e um ,by(e, em PASCA! #No(e +ue um ,unsigned c5ar, *ode .ariar de 0 a(6 GKK 7 00000000b a(6 11111111b 7 e um ,signed c5ar, *ode .ariar de 71G a(6 1G[ 7 e2a(amen(a a mesma 8ai2a3 *or6m um (em sinal e o ou(ro n$o%&9 A com*lica$o +ue 8alei acima 6 com rela$o re*resen(a$o dos n=meros nega(i.os9 uando um n=mero n$o 6 naga(i.o3 bas(a con.er(?7lo *ara base decimal +ue .oc? saber' +ual 6 esse n=mero3 no en(an(o3 n=meros nega(i.os *recisam ser ,com*lemen(ados, *ara +ue saibamos o n=mero +ue es(' sendo re*resen(ado9 A coisa N 8unciona da seguin(e 8orma: MO │ 00001010b W 10 │ │ 10001010b W 710 #ERRA& │ Q
N$o bas(a ,es+uecermos, o bi( [ e lermos o res(an(e do by(e9 *rocedimen(o corre(o *ara sabermos +ue n=mero es(' sendo re*resen(ado nega(i.amen(e no segundo e2em*lo 6:
➠ n.er(e7se (odos os bi(s e3 ➠ Soma7se 1 ao resul(ado MO │ 10001010b f 01110101b Z 00000001b f 01110110b │ │ 01110110b W 11 │ │ !ogo: │ │ 10001010b W 711 │ Q Com isso *odemos e2*licar a di8erena en(re os e2(remos da 8ai2a de um ,signed c5ar,:
➠ s n=meros *osi(i.os con(am de 00000000b a(6 01111111b3 is(o 63 de 0 a(6 1G[9
➠ s n=meros nega(i.os con(am de 10000000b a(6 11111111b3 is(o 63 de 71G a(6 719
Em ,C, #ou PASCA!&3 a mesma l)gica *ode ser a*licada aos ,in(, e ,long, #ou NTEXER e !NXNT&3 s) +ue a +uan(idade de bi(s ser' maior #,in(, (em LG ou 1D bi(s de (aman5o3 de acordo com a ar+ui(e(ura3 e ,long, (em LG&9 N$o se *reocu*e /T com a re*resen(a$o de n=meros nega(i.os em bin'rio999 A CP/ (oma con(a de (udo isso so4in5a999 mas3 as .e4es3 .oc? (em +ue saber +ue resul(ado *oder' ser ob(ido de uma o*era$o ari(im6(ica em seus *rogramas3 oJ> As ou(ras duas o*era;es ma(em'(icas b'sicas #mul(i*lica$o e di.is$o& (anb6m es($o *resen(es nos *rocessadores 02D999 as3 n$o necessi(amos .er como o *rocesso 6 8ei(o a n-.el bin'rio9 Con8ie na CP/% :&
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 0L ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra Comecemos a micro*rocessadores regis(radores%
dar da
uma ol5adela 8am-lia NTE!
na ar+ui(e(ura 02D999 Vamos
dos aos
En(enda os regis(radores como se 8ossem .ari'.eis +ue o micro*rocessador dis*onibili4a ao sis(ema9 TS os regis(radores (?m 1D bi(s de (aman5o e a+ui .ai a descri$o deles:
MO │ AH │O h │ │ BH │ h h Regis(radores de uso geral │ CH │ h │ │ H │ Q MO │ S │ -ndice FNTE #Source nde2& h │ │ -ndice ESTN #es(ina(ion nde2& Q MO │ SP │ A*on(ador de *il5a #S(acJ Poin(er& h │ BP │ A*on(ador de base #Base Poin(er& Q MO │ CS │ Segmen(o de C)gido #Code Segmen(& h │ S │ Segmen(o de ados #a(a Segmen(& h │ ES │ Segmen(o de dados E2(ra #E2(ra da(a Segmen(& h │ SS │ Segmen(o de Pil5a #S(acJ Segmen(& Q MO │ P │ A*on(ador de ins(ru$o #ns(ruc(ion Poin(er& Q MO │Flags │ Sinali4adores Q
Por en+uan(o .amos nos de(er na descri$o dos regis(radores uso geral999 Eles *odem ser subdi.ididos em dois regis(radore de oi(o bi(s cada:
AH #1D bi(s& MO MO │ A] │ A! │ Q 1K [ 0
BH #1D bi(s& MO MO │ B] │ B! │ Q 1K [ 0
CH #1D bi(s& MO MO │ C] │ C! │ Q 1K [ 0
H #1D bi(s& MO MO │ ] │ ! │ Q 1K [ 0
A] 6 o by(e mais signi8ica(i.o do regis(rador AH3 en+uan(o +ue A! 6 o menos signi8ica(i.o9 Se al(erarmos o con(e=do de A!3 es(aremos al(erando o by(e menos signi8ica(i.o de AH ao mesmo (em*o999 N$o e2is(em regis(radores de oi(o bi(s em se*arado999 (udo 6 uma coisa s)9 Por(an(o3 ao mani*ularmos A]3 es(aremos mani*ulando AH ao mesmo (em*o% nome de cada regis(rador (em o seu sen(ido de ser999 ,A, de AH +uer di4er +ue es(e regis(rador 6 um ,acumulador, #usado *or de8aul( em algumas o*era;es ma(ema(icas%&3 *or e2em*lo999 AH BH CH H
f f f f
,H, by(e,9
Acumulador Base Con(ador ados de
AH
signi8ica ,eH(ended,9
,], de A] signi8ica ,]ig5
Embora es(es regis(radores *ossam ser usados sem res(ri;es3 6 in(eressan(e a(ribuir uma 8un$o *ara cada um deles nos nossos *rogramas sem*re +ue *oss-.el999 s(o 8acili(a a lei(ura do c)digo e nos educa a seguirmos uma lin5a de racioc-nio mais concisa999 as3 se 8or de sua *re8er?ncia n$o seguir +ual+uer *adr$o no uso desses regis(radores3 n$o se *reocu*e999 n$o 5a.er' +ual+uer des.an(agem nisso #&9 No en(an(o3 esses regis(radores *odem ser usados com ou(ras 8inalidades999 Podemos inclu-7los no gru*o de ,regis(radores de uso geral,3 mas assim como alguns regis(radores de uso geral3 eles (?m a*lica$o e2clusi.a em algumas ins(ru;es3 S e s$o usados es*eci8icamen(e como -ndices em ins(ru;es +ue mani*ulam blocos #(amb6m .eremos isso mais (arde%&9 s regis(radores CS3 S3
ES
e
SS
arma4enam os segmen(os onde
es($o o c)digo #*rograma sendo e2ecu(ado&3 os dados3 os dados e2(ras3 e a *il5a3 res*ec(i.amen(e9 !embre7se +ue a mem)ria 6 segmen(ada em blocos de DIJby(es #d? uma ol5ada na *rimeira mensagem dessa s6rie&9 uando nos re8erimos3 a(ra.6s de alguma ins(ru$o3 a um endereo de mem)ria3 es(aremos nos re8erindo ao FFSET den(ro de um segmen(o9 regis(rador de segmen(o usado *ara locali4ar o dado no o88se( es*eci8icado .ai de*ender da *r)*ria ins(ru$o999 /m e2em*lo em assembly: MO │ V A!3j1IA5k │ Q n=mero 5e2adecimal en(re os colc5e(es 6 a indica$o de um o88se( em um segmen(o999 Por de8aul(3 a maioria das ins(ru;es usa o segmen(o de dados #.alor em S&9 A ins(ru$o acima 6 e+ui.alen(e a: MO │ A! W S:j1IA5k │ Q s(o 63 em A! ser' colocado o by(e +ue es(' arma4enado no o88se( 1IA5 do segmen(o de dados #.alor em S&9 Veremos mais sobre os segmen(os e as ins(ru;es mais (arde :& Se +uisessemos locali4ar o by(e dese@ado em ou(ro segmen(o #mas no mesmo o88se(& de.emos es*eci8icar o regis(rador de segmen(o na ins(ru$o: MO │ V A!3ES:j1IA5k │ Q A+ui o .alor de ES ser' usado9 regis(rador P #ns(ruc(ion Poin(er& 6 o o88se( do segmen(o de c)digo +ue con(6m a *r)2ima ins(ru$o a ser e2ecua(da9 Es(e regis(rador n$o 6 acess-.el *or +ual+uer ins(ru$o #*elo menos n$o *elas documen(adas *ela n(el&999 6 de uso in(erno do micro*rocessador9 No en(an(o e2is(em alguns mace(es *ara conseguirmos ob(er o seu con(e=do #o +ue na maioria das a*lica;es n$o 6 necessario999 Para +ue con5ecer o endereo da *r)2ima ins(ru$o se ela .ar ser e2ecu(ada de +ual+uer @ei(o>&9 regis(rador SP 6 o o88se( do segmen(o SS #segmen(o de *il5a& onde o *r)2imo dado .ai ser em*il5ado9 A *il5a ser.e *ara arma4enar dados +ue *os(eriormen(e *odem ser recu*erados sem +ue (en5amos +ue usar um dos regis(radores *ara esse 8im9 Tamb6m 6 usada *ara arma4enar o endereo de re(orno das sub7ro(inas9 A *il5a ,cresce, de cima *ara bai2o3 is(o 63 SP 6 decremen(ado cada .e4 +ue um no.o dado 6 colocado na *il5a9 No(e (amb6m +ue e2is(e um regis(rador de segmen(o e2clusi.o *ara a *il5a999 SP sem*re es(' relacionado a esse segmen(o #SS&3 como 8oi di(o an(es9 Para ilus(rar o 8uncionamen(o da *il5a3 no gr'8ico abai2o simularemos o em*il5amen(o do con(e=do do regis(rador AH a(ra.6s da
ins(ru$o: MO │ P/S] AH │ Q MO │ AH W AKG[5 #Valor em AH& │ │ │ │ MO MO │ │ │ >>>>5 │ SP W n │ >>>>5 │ │ │ h h │ │ │ │ │ AKG[5 │ SP W n 7 G │ │ Q Q │ │ │ │ #an(es de P/S] AH& #de*ois de P/S] AH& │ Q bser.e +ue SP sem*re a*on(a *ara o =l(imo dado em*il5ado9 Na realidade SP 6 decremen(ado de duas *osi;es ao in.6s de a*enas uma999 mas3 esse de(al5e dei2o *ara mais (arde9 regis(rador BP *ode ser usado como a*on(ador *ara a base da *il5a #@' +ue3 *or de8aul(3 es(' relacionado a SS& ou como um regis(rador de uso geral999 de*ende do seu *rograma9 Veremos isso de(al5adamen(e mais (arde9 /m dos regis(radores mais im*or(an(es de +ual+uer micro*rocessador 6 o de ,Flags,9 Eis uma descri$o dos bi(s des(e regis(rador #a descri$o abai2o a*lica7se ao 0D9 Normalmen(e n$o acessamos dire(amen(e o regis(rador de 8lags 7 embora *ossamos 8a4?7lo 7 *or isso n$o 6 con.enien(e assumirmos +ue os bi(s es($o sem*re no mesmo lugar *ara +ual+uer micro*rocessador da 8am-lia 02D%&: MO │ MO │ │ │ │ │ │ ││││T│S│^│ │A│ │P│ │C│ │ │ Q │ │ 1K 0 │ │ │ │ C W Carry │ │ P W Pari(y │ │ A W Au2iliar Carry │ │ ^ W ^ero │ │ S W Signal │ │ T W Tra* │ │ W n(erru*( Enable Flag │ │ W irec(ion │ │ W .erFlo │ Q
➠ Carry: Esse 8lag 6 se(ado sem*re +uando 5ou.er ,.ai um, de*ois uma adi$o ou +uando 5' BRR< de*ois de uma sub(ra$o9 +uando3 numa o*era$o de deslocamen(o de bi(s3 o bi( mais e2(remo 8or deslocado *ara 8ora do dado #su*on5a um by(e999
de u ao se
(odos os bi(s 8orem deslocados em uma *osi$o *ara a direi(a3 o +ue acon(ece com o bi( 0>999 Res*os(a: Vai *ara o carry%&
➠ Pari(y: e*ois de uma ins(ru$o ari(im6(ica ou l)gica es(e bi( in8orma se o resul(ado (em um n=mero *ar de ,1,s ou n$o9
➠ Au2iliar Carry: gual ao carry3 mas indica o ,.ai um, no meio de um dado #no caso de um by(e3 se 5ou.e ,.ai um, do bi( L *ara o bi( I%&9
➠ ^ero: e*ois de uma o*era$o ari(im6(ica indica se o resul(ado 6 4ero ou n$o9
ou
l)gica3 esse 8lag
➠ Signal: e*ois de uma ins(ru$o ari(im6(ica ou l)gica3 es(e 8lag 6 uma c)*ia do bi( de mais al(a ordem do resul(ado3 is(o 63 seu sinal #d? uma ol5ada na ,re*resen(a$o de n=meros nega(i.os em bin'rio, no (e2(o an(erior%&9
➠ Tra*: uando se(ado #1& e2ecu(a ins(ru;es *asso7a7*asso999 N$o nos in(eressa es(udar esse bi( *or causa das di8erenas de im*lemen(a$o des(e 8lag em (oda a 8am-lia 02D9
➠ n(erru*( Enable Flag ]abili(aesabili(a o recon5ecimen(o de in(erru*;es mascar'.eis *ela CP/9 Sobre in(erru*;es3 .eremos mais (arde%
➠ irec(ion: uando usamos ins(ru;es de mani*ula$o de blocos3 *recisamos es*eci8icar a dire$o +ue usaremos #do inicio *ara o 8im ou do 8im *ara o inicio&9 uando W0 a dire$o 6 a do in-cio *ara o 8im999 a dire$o 6 con(r'ria%
W13 en($o
➠ .erFlo:
e*ois de uma ins(ru$o ari(im6(ica ou l)gica3 es(e bi( indica se 5ou.e mudana no bi( mais signi8ica(i.o3 ou se@a3 no sinal9 Por e2em*lo3 se somarmos FFFF5 Z 00015 ob(eremos 0059 bi( mais signi8ica(i.o .ariou de 1 *ara 0 #o coun(e=do inicial de um regis(rador era FFFF5 e de*ois da soma 8oi *ara 00005&3 indicando +ue o resul(ado saiu da 8ai2a #o.er8lo& 7 ora3 FFFF5 Z 00015 W 1000053 *or6m um regis(rador (em 1D bi(s de (aman5o e o resul(ado cabe em 1[ bi(s9 Nes(e e2em*lo3 o bi( de carry (amb6m ser' se(ado *ois 5ou.e ,.ai um, do bi( 1K *ara o ine2is(en(e bi( 1D3 mas n$o con8unda o 8lag de o.er8lo com o carry%
uando aos demais bi(s3 n$o #1 ou 0&9
se *ode *re.er seus es(ados l)gicos
Na *r)2ima ,aula, comearemos a .er algumas ins(ru;es do micro*rocessador 0D9 Ainda n$o escre.eremos nen5um *rograma3 a in(en$o 6 8amiliari4'7lo com a ar+ui(e(ura do micro*rocessador an(es de comearmos a colocar a m$o na massa999 (en5a um *ouco de *aci?ncia% :&
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 0I ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra Comearemos a .er algumas ins(ru;es do micro*rocessador agora9 E2is(em os seguin(es (i*os de ins(ru;es:
➠ ➠ ➠ ➠ ➠ ➠ ➠ ➠
ns(ru;es ns(ru;es ns(ru;es ns(ru;es ns(ru;es ns(ru;es ns(ru;es ns(ru;es
0D
Ari(im6(icas !)gicas de Con(role de Flu2o de Programa de mani*ula$o de 8lags de mani*ula$o da *il5a de mani*ula$o de blocos de mani*ula$o de regis(radoresdados de En(radaSa-da
Vamos comear com as ins(ru;es de mani*ula$o regis(radoresdados *or serem es(as as mais 8'ceis de en(ender9
de
┏━━━━━━━━━━━━━━━┓ ┃ ns(ru$o V ┃ ┗━━━━━━━━━━━━━━━┛ V (em a 8inalidade de Vimen(ar um dado de um lugar *ara ou(ro9 Por e2em*lo3 *ara carregar um regis(rador com um de(erminado .alor9 s(o 6 8ei(o com V:
MO │ V AH300015 │ Q a mesma coisa +ue di4er: ,AH W 1,9 .alor 1 *ara den(ro do regis(rador AH9
Na .erdade3 mo.imen(amos o
Podemos mo.er o con(e=do de um regis(rador *ara ou(ro:
MO │ V B]3C! │ Q a mesma coisa +ue ,B] W C!,% s regis(radores de segmen(o n$o *odem ser iniciali4ados com V (omando um *arame(ro imedia(o #num6rico&9 Esses regis(radores s$o iniciali4ados indire(amen(e:
MO │ V S30 ERRA%%% │ │ │ │ V AH30 │ │ V S3AH CRRET% │ Q Carregar um regis(rador com o con(e=do #by(e ou ord3 de*ende da ins(ru$o%& arma4enado em um segmen(o 6 sim*les3 bas(a es*eci8icar o o88se( do dado en(re colc5e(es9 A(en$o +ue o segmen(o de dados #S& 6 assumido *or de8aul( com algumas e2cess;es:
MO │ V A!3j0FFFF5k │ Q
A ins(ru$o acima3 *ega o by(e arma4enado no endereo S:FFFF5 e coloca7o em A!9 Sabemos +ue um by(e .ai ser lido do o88se( es*eci8icado *or+ue A! (em bi(s de (aman5o9 Ao in.6s de usarmos um o88se( imedia(o *odemos usar um regis(rador:
MO │ V BH30FFFF5 │ │ V C]3jBHk │ Q
Nes(e caso3 BH con(6m o o88se( e o by(e no endereo S:BH 6 arma4enado em C]9 No(e +ue o regis(rador usado como indice obriga(oriamen(e de.e ser de 1D bi(s9 /ma obser.a$o +uan(o a essa modalidade: e*endendo do regis(rador usado como o88se(3 o segmen(o de8aul( *oder' ser S ou SS9 Se ao in.6s de BH usassemos BP3 o segmen(o de8aul( seria SS e n$o S 7 de uma ol5ada no diagrama de dis(ribui$o dos regis(radores no (e2(o an(erior9 BP 8oi colocado no mesmo bloco de SP3 indicando +ue ambos es($o relacionados com SS #Segmen(o de *il5a& 7 Eis uma (abela das modalidades e dos segmen(os de8aul( +ue *odem ser usados como o88se(:
MO │ 88se( usando regis(ros │ Segmen(o de8aul( │ h │ jS Z deslocamen(ok │ S │ │ j Z deslocamen(ok │ S │ │ jBP Z deslocamen(ok │ SS │ │ jBH Z deslocamen(ok │ S │ │ jBH Z S Z deslocamen(ok │ S │ │ jBH Z Z deslocamen(ok │ S │ │ jBP Z S Z deslocamen(ok │ SS │ │ jBP Z Z deslocamen(ok │ SS │ Q
,deslocamen(o,
*ode
ser
su*rimido
se
8or 09
Voc? *ode e.i(ar o segmen(o de8aul( e2*lici(ando um regis(rador de segmen(o na ins(ru$o:
MO │ V ]3ES:jBHk /sa ES ao in.6s de S │ │ V A!3CS:jS Z Ik /sa CS ao in.6s de S │ Q Re*are +ue (en5o usado os regis(radores de bi(s *ara arma4enar os dados999 Pode7se usar os de 1D bi(s (amb6m:
MO │ V ES:jBHk3AH Poe o .alor de AH *ara ES:BH │ Q
S) +ue nes(e caso ser$o arma4enados G by(es no endereo ES:BH9 *rimeiro by(e 6 o menos signi8ica(i.o e o segundo o mais signigica(i.o9 Essa ins(ru$o e+ui.ale7se a:
MO │ V ES:jBHk3A! ns(ru;ess +ue 8a4em a mesma │ │ V ES:jBH Z 1k3A] coisa +ue V ES:jBHk3AH │ Q
Re*are (amb6m +ue n$o 6 *oss-.el mo.er o con(e=do de uma *osi$o da mem)ria *ara ou(ra3 dire(amen(e3 usando V9 E2is(e ou(ra ins(ru$o +ue 8a4 isso: VSB ou VS<9 Veremos essas ins(ru;es mais (arde9 Regra geral: /m dos o*erandos TE +ue ser um regis(rador% Sal.o no caso da mo.imen(a$o de um imedia(o *ara uma *osi$o de mem)ria:
MO │ V jk3jSk ERR% │ │ V jBHk30 % │ Q
Para ilus(rar o uso da ins(ru$o V3 eis um *edao do c)digo usado *ela R7BS do B PSG odelo K0^ *ara .eri8icar a in(egridade dos regis(radores da CP/:
MO │ 999 │ │ V AH30FFFF5 Poe 0FFFF5 em AH │ │ V S3AH │ │ V BH3S │ │ V ES3BH │ │ V CH3ES │ │ V SS3CH │ │ V H3SS │ │ V S3H │ │ V 3S │ │ V BP3 │ │ V SP3BP │ │ 999 │ Q Se o con(e=do de BP n$o 8or 0FFFF5 en($o a CP/ es(' com algum *roblema e o com*u(ador n$o *ode 8uncionar% s 8lags s$o (es(ados de uma ou(ra 8orma999 :&
┏━━━━━━┓ ┃ HC]X ┃ ┗━━━━━━┛ Es(a ins(ru$o ser.e *ara (rocarmos o con(e=do de um regis(rador *elo ou(ro9 Por e2em*lo:
MO │ HC]X A]3A! │ Q Se
A]W1A5
e
A!WD53
a*)s
es(a ins(ru$o A]WD5 e A!W1A5 *or
causa da (roca999 Pode7se usar uma re8er?ncia mem)ria assim como em V999 com a mesma res(ri$o de +ue um dos o*erandos TE +ue ser um regis(rador9 N$o 5' *ossibilidade de usar um o*erando imedia(o9
┏━━━━━━━━━━━━━━━┓ ┃ VSB e /S< ┃ ┗━━━━━━━━━━━━━━━┛ Essas ins(ru;es su*rem a de8ici?ncia de V +uan(o a mo.imen(a$o de dados de uma *osi$o de mem)ria *ara ou(ra dire(amen(e9 An(es de ser c5amada os seguin(es regis(radores (em +ue ser iniciali4ados:
MO │ S:S S e S (?m o endereo 8on(e │ │ ES: ES e (?m o endereo des(ino │ Q ai *odemos e2ecu(ar VSB ou VS<9 VSB mo.e um by(e3 en+uan(o VS< mo.e um ord #1D bi(s&9 s regis(radores S e sao incremen(ados ou decremen(ados de acordo com o 8lag #irec(ion& 7 Ve@a discuss$o sobre os 8lags na mensagem an(erior9 No caso de VS<3 S e serao incremen(ados #ou decremen(ados& de G *osi;es de 8orma +ue S:S e ES: a*on(em sem*re *ara a *r)2ima ord9
┏━━━━━━━━━━━━━━━┓ ┃ STSB e STS< ┃ ┗━━━━━━━━━━━━━━━┛ Essas ins(ru;es ser.em *ara arma4enar um .alor +ue es(' em AH ou A! #de*endendo da ins(ru$o usada& no endereo a*on(ado *or ES:9 En($o3 an(es de ser c5amada3 os seguin(es regis(radores de.em ser iniciali4ados:
MO │ AH f Valor a ser arma4enado se usarmos STS< │ │ A! f Valor a ser arma4enado se usarmos STSB │ │ ES: f Endereo onde o dado ser' arma4enado │ Q e*ois da e2ecu$o da ins(ru$o o regis(rador ser' incremen(ado ou decremen(ado de acordo com o 8lag #irec(ion&9 ser' incremen(ado de G no case de usarmos STS<3 is(o garan(e +ue ES: a*on(e *ara a *ro2ima ord9
┏━━━━━━━━━━━━━━━┓ ┃ !SB e !S< ┃ ┗━━━━━━━━━━━━━━━┛ Essas ins(ru;es ser.em *ara ler um .alor +ue es(' no endereo a*on(ado *or S:S e arma4en'7lo em AH ou A! #de*endendo da
ins(ru$o usada&9 En($o3 an(es de regis(radores de.em ser iniciali4ados:
ser
c5amada3
os
seguin(es
MO │ S:S f Endereo de onde o dado ser' lido │ Q e*ois da e2ecu$o da ins(ru$o o regis(rador S ser' incremen(ado ou decremen(ado de acordo com o 8lag #irec(ion&9 No caso de usarmos !S<3 S ser' incremen(ado de G *ara garan(ir +ue S:S a*on(e *ara a *r)2ima ord9
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ u(ras ins(ru;es de mani*ula$o de regis(rosdados ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ E2is(em ainda as ins(ru;es !EA3 !ES e !S9
➠ !EA:
!EA 63 basicamen(e3 igual a ins(ru$o V3 com a*enas uma di8erena: o o*erando ,8on(e, 6 um endereo #*recisamen(e: um ,o88se(,&9 !EA sim*lesmen(e calcula o endereo e (rans8ere *ara o o*erando ,des(ino,3 de 8orma +ue as ins(ru;es abai2o sao e+ui.alen(es:
MO │ V BH31005 │ │ !EA BH3j1005k │ Q Por6m3 a ins(ru$o:
MO │ !EA H3jBH Z S Z 105k │ Q E+ui.ale a:
MO │ V H3BH │ │ A H3S H W H Z S │ │ A H3105 H W H Z 105 │ Q Re*are +ue a*enas uma ins(ru$o 8a4 o ser.io de (r?s%% Nos *rocessadores GD e LD a di8erena 6 signi8ica(i.a3 *ois3 no e2em*lo acima3 !EA gas(ar' L #nos GD& ou G #nos LD& ciclos de m'+uina en+uando o e+ui.alen(e gas(ar' 11 #nos GD& ou D #nos LD& ciclos de m'+uina% Nos *rocessadores 00D a di8erena n$o 6 (ao grande999
bs: Consideremos cada ciclo de m'+uina seria3 a*ro2imadamen(e3 num LDHI03 algo em (orno de L00ns 7 ou 03000000Ls9 uma medida em*irica e n$o e2*ressa a grande4a real #de*ende de uma s6rie de 8a(ores n$o considerados a+ui%&9
o*erando
,des(ino,
6
sem*re
um
regis(rador9
o*erando
,8on(e, 6 sem*re um endereo9
➠ !S e !ES E2is(e uma 8orma de carregar um *ar de regis(radores #segmen(o:o88se(& de uma s) .e49 Se +uisermos carregar S:H bas(a usar a ins(ru$o !S3 caso o al.o se@a ES3 usa7se !ES9 Su*on5amos +ue numa *osi$o da mem)ria (en5amos um double ord #n=mero de LG bi(s& arma4enado9 A ord mais signi8ica(i.a corres*ondendo a um segmen(o e a menos signigica(i.a a um o88se( #esse 6 o caso da (abela dos .e(ores de in(erru*$o3 +ue descre.erei com *oucos de(al5es em uma ou(ra o*or(unidade%&9 Se usamos:
MO │ !ES BH3jSk │ Q
*ar ES:BH ser' carregado com o double ord arma4enado no endereo a*on(ado *or S:S #re*are no segmen(o de8aul( +ue discu(imos em um (e2(o an(erior%&9 A ins(ru$o acima 6 e+ui.alen(e a:
MO │ V BH3jSZGk │ │ V ES3BH │ │ V BH3jSk │ Q e no.o3 uma ins(ru$o subs(i(ui (r?s%
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ani*ulando blocos999 *ar(e ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ As ins(ru;es VSB3 VS<3 STSB3 STS<3 !SB e !S< *odem ser usadas *ara lidar com blocos de dados9 Para is(o3 bas(a indicar no regis(rador CH a +uan(idade de dados a serem mani*ulados e acrescen(ar REP na 8ren(e da ins(ruao9 Eis um (rec5o de uma *e+uena ro(ina +ue a*aga o .ideo em modo (e2(o #0 2 GK colorido&:
MO │ V AH30B005 │ │ V ES3AH Poe em ES o segmen(o do .-deo │ │ V 30 Comea no 88se( 0 │ │ V A]3[ A] W a(ribu(o do carac(er │ │ [ W cin4a com 8undo *re(o │ │ V A!3 A! W carac(er usado *ara a*agar │ │ V CH3G000 CH W con(ador #I000 by(es ou │ │ G000 ords&9 │ │ REP STS< Preenc5e os G000 ords com AH │ Q modi8icador REP di4 a ins(ru$o +ue es(a de.e ser e2ecu(ada CH .e4es9 No(e +ue a cada e2ecu$o de STS< o regis(rador a*on(ar' *ara a *ro2ima ord9 Su*on5a +ue +ueiramos mo.er I000 by(es de alguma *osi$o da mem)ria *ara o .ideo3 *reenc5endo a (ela com esses I000 by(es:
MO │ V AH30B005 │ │ V ES3AH Poe em ES o segmen(o do .-deo │ │ V AH3SEX TABE!A │ │ V S3AH Poe em S o segmen(o da (abela │ │ V S3FFSET TABE!A Comea no o88se( inicial da (abela │ │ V 30 Comea no 88se( 0 │ │ V CH3I000 CH W con(ador #I000 by(es& │ │ REP VSB Co*ia I000 by(es de S:S *ara ES: │ Q
No(a: modi8icador REP s) *ode ser *receder as seguin(es ins(ru;es: VSB3 VS<3 STSB3 STS<3 !SB3 !S<3 CPSB3 CPS<3 SCASB3 SCAS<3 /TSB3 /TS<3 NSB3 NS<9 As ins(ru;es nao .is(as no (e2(o acima ser$o de(al5adas mais (arde999 E2is(em mais algumas ins(ru;es de mani*ula$o de regis(radoresdados3 bem como mais algumas de mani*ula$o de blocos9 ue 8icar$o *ara uma *r)2ima mensagem9
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 0K ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra e*ois de algumas ins(ru;es de mo.imen(a$o de dados .ou mos(rar a mecnica da l)gica booleana3 bem como algumas ins(ru;es9 A l)gica booleana baseia7se nas seguin(es o*era;es: AN3 R3 NT9 Para sim*li8icar a min5a digi(a$o .ou usar a no(a$o sim*li8icada: p #AN&3 q #R& e #NT&9 Essa no(a$o 6 usada na linguagem C e em mui(os manuais relacionados a 5ardare da B9
➠ *era$o AN: A o*era$o AN 8unciona de acordo com a seguin(e (abela7.erdade:
MO │ S W A p B │ h │ A │ B │ S │ h │ 0 │ 0 │ 0 │ │ 0 │ 1 │ 0 │ │ 1 │ 0 │ 0 │ │ 1 │ 1 │ 1 │ Q No(e +ue o resul(ado #S& ser' 1 a*enas se A ,E, B 8orem 19
A*licando es(a l)gica bi( a bi( em o*era;es en.ol.endo dois by(es ob(eremos um (erceiro by(e +ue ser' o *rimeiro AN o segundo: MO │ A W 01010111b B W 00001111b │ │ │ │ S W A p B f 01010111b │ │ p 00001111b │ │ │ │ 00000111b │ Q /ma das u(ilidades de AN 6 rese(ar um de(erminado bi( sem a8e(ar os demais9 Su*on5a +ue +ueira rese(ar o bi( L de um de(erminado by(e9 Para (an(o bas(a e8e(uar um AN do by(e a ser (rabal5ado com o .alor 11110111b #A*enas o bi( L rese(ado&9 Eis a sin(a2e da ins(ru$o AN: MO │ AN A!311110111b │ │ AN BH30005 │ │ AN !3C! │ │ AN jk3A] │ Q !embrando +ue o o*erando des(ino #o mais a es+uerda& de.e sem*re
ser um regis(rador ou uma re8erencia a mem)ria9 o o*erando a direi(a #8on(e& *ode ser um regis(rador3 uma re8er?ncia a mem)ria ou um .alor imedia(o3 com a res(ri$o de +ue n$o *odemos usar re8er?ncias a mem)ria nos dois o*erandos9 A ins(ru$o AN a8e(a os F!AXS ^3 S e P e 4era os 8lags Cy #Carry& e #.e@a os 8lags em alguma mensagem an(erior a es(a&9
➠ *era$o R:
MO │ S W A q B │ h │ A │ B │ S │ h │ 0 │ 0 │ 0 │ │ 0 │ 1 │ 1 │ │ 1 │ 0 │ 1 │ │ 1 │ 1 │ 1 │ Q
No(e +ue S ser' 1 se A ,/, B 8orem 19 a mesma 8orma +ue AN3 a*licamos essa l)gica bi( a bi( en.ol.endo um by(e ou ord a(ra.6s de uma ins(ru$o em assembly9 Ve@amos um e2em*lo da u(ilidade de R: MO │ A W 01010111b B W 10000000b │ │ │ │ S W A q B f 01010111b │ │ q 10000000b │ │ │ │ 11010111b │ Q A o*era$o R 6 ideal *ara se(armos um de(erminado bi( sem a8e(ar os demais9 No e2em*lo acima B (em a*enas o bi( [ se(ado999 de*ois da o*era$o R com A o resul(ado 8inal 8oi A com o bi( [ se(ado% :& A sin(a2e de R 6 a mesma +ue a de AN #ob.iamen(e (rocando7se AN *or R&9 s 8lags a8e(ados s$o os mesmos da ins(ru$o AN%
➠ *era$o NT: NT sim*lesmen(e in.er(e (odos os bi(s de um by(e ou ord:
MO │ S W A │ h │ A │ S │ h │ 0 │ 1 │ │ 1 │ 0 │ Q
A sin(a2e da ins(ru$o em assembly 6 a seguin(e: MO │ NT A! │ │ NT H │ │ NT jSk │ Q
➠ *era$o HR: A o*era$o HR 6 deri.ada das (r?s acima9 +ue descre.e HR 6:
A
e+ua$o
booleana
MO │ S W #A AN B& R #A AN B& W A B │ Q ue na (abela7.erdade 8ica:
MO │ S W A B │ h │ A │ B │ S │ h │ 0 │ 0 │ 0 │ │ 0 │ 1 │ 1 │ │ 1 │ 0 │ 1 │ │ 1 │ 1 │ 0 │ Q
/so o simbolo *ara o HR a+ui9 HR 8unciona da mesma 8orma +ue R3 s) +ue o resul(ado ser' 1 se APENAS A ou APENAS B 8or 13 mel5or di4endo: Se ambos 8orem di8eren(es9 HR 6 mui(o =(il +uando se +uer in.er(er um de(erminado um by(e ou ord sem a8e(ar os ou(ros:
bi(
de
MO │ A W 01010111b B W 00001111b │ │ │ │ S W A B f 01010111b │ │ 00001111b │ │ │ │ 01011000b │ Q No e2em*lo acima signi8ica(i.os de A9
in.er(emos
a*enas
os
+ua(ro
bi(s
A sin(a2e e os 8lags a8e(ados s$o os mesmos +ue AN e R9
menos
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 0D ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra ns(ru;es ari(im6(icas s$o o ()*ico de 5o@e9 bre.emen(e3 os 8lags e os sis(emas de numera$o9 a*lica$o *r'(ica:
t' discu(i3 A+ui .ai uma
➠ Soma: A soma 6 8ei(a a(ra.6s das ins(ru;es A e AC9 A di8erena en(re elas 6 +ue uma 8a4 a soma normalmen(e e a ou(ra 8a4 a mesma coisa acrecen(ando o con(e=do do 8lag CARR"9 Eis a sin(a2e: MO │ A A!3105 │ │ AC A]3GG5 │ │ │ │ A AH3GG105 │ Q As duas *rimeiras ins(ru;es 8a4em e2a(amen(e a mesma coisa +ue a (erceira9 No(e +ue na *rimeiria somamos A! com 105 e o resul(ado 8icar' em A! #se ocorrer ,.ai um, nes(a soma o 8lag CARR" ser' se(ado&9 A segunda ins(ru$o soma A] com GG5 AS o carry resul(an(e da *rimeira ins(ru$o e o resul(ado 8icar' em A] #no.amen(e se(ando o 8lag carry se 5ou.er ou(ro ,.ai um,%&9 A (erceira ins(ru$o 8a4 a mesma coisa *or+ue soma GG105 a AH3 8icando o resul(ado em AH e o *oss-.el ,.ai um, no carry9 Todos os 8lags s$o a8e(ados a*)s ins(ru;es de soma3 e2ce(o: 3 e Tra*9
a
e2ecu$o
de
uma
das
➠ Sub(ra$o Semel5an(e as ins(ru;es de soma3 sub(ra$o: S/B e SBB9 A *rimeira 8a4 segunda 8a4 a mesma coisa sub(raindo 8lag CARR" #como 6 uma sub(ra$o o CARR"
e2is(em duas ins(ru;es de a sub(ra$o sim*les e a (amb6m o con(e=do *r6.io do 6 con5ecido como BRR<%&9
A sin(a2e: MO │ S/B A!31 │ │ SBB A]30 │ │ │ │ S/B AH31 │ Q Como no e2em*lo an(erior3 as e2a(amen(e o +ue a (erceira 8a4999 regra das ins(ru;es de soma%
➠ ncremen(o e decremen(o:
duas *rimeiras ins(ru;es 8a4em s 8lags a8e(ados seguem a mesma
As ins(ru;es NC e EC s$o usadas no lugar de A e S/B se +uisermos incremen(ar ou decremen(ar o con(e=do de algum regis(rador #ou de uma *osi$o de mem)ria& de uma unidade9 A sin(a2e 6 sim*les: M7O │ EC AH │ │ NC B! │ Q7 s 8lags a8e(ados seguem a mesma regra de uma ins(ru$o de soma ou uma de sub(ra$o% ➠ ul(i*lica$o: s *rocessadores da 8am-lia 02D *ossuem ins(ru;es de mul(i*lica$o e di.is$o in(eiras #*on(o 8lu(uan(e 8ica *ro 0[&9 Alguns cuidados de.em ser (omados +uando usarmos uma ins(ru$o de di.is$o #+ue ser' .is(a mais adian(e%&9 /ma coisa in(eressan(e com a mul(i*lica$o 6 +ue se mul(i*licarmos dois regis(radores de 1D bi(s ob(eremos o resul(ado necessariamen(e em LG bi(s9 *ar de regis(radores H e AH s$o usados *ara arma4enar esse n=mero de LG bi(s da seguin(e 8orma: H ser' a ord mais signi8ica(i.a e AH a menos signi8ica(i.a9 Por e2em*lo3 se mul(i*licarmos 0FFFF5 0FFFE00015 #H W 0FFFE5 e AH W 00015&9 Eis a regra *ara descobrir o*era$o de mul(i*lica$o:
o
*or
(aman5o
0FFFF5
ob(eremos:
do res(ul(ado de uma
MO │ A B W │ h │ A │ B │ │ h │ bi(s │ bi(s │ 1D bi(s │ │ │ │ │ │ 1D bi(s │ 1D bi(s │ LG bi(s │ Q
A mul(i*lica$o sem*re ocorrer' en(re o acumulador #A! ou AH& e um ou(ro o*erando9 Eis a sin(a2e das ins(ru;es: M7O │ /! B! AH W A! B! │ │ /! CH H:AH W AH CH │ Q7 A *rimeira ins(ru$o #/!& n$o considera o sinal dos o*erandos9 Nes(e caso3 como B! 6 de bi(s3 a mul(i*lica$o se dar' en(re B! e A! e o resul(ado ser' arma4enado em AH9 A segunda ins(ru$o le.a em considera$o o sinal dos o*erandos e3 como CH 6 de 1D bi(s3 a mul(i*lica$o se dar' en(re CH e AH e o res(ul(ado ser' arma4enado em H e AH9 !embrando +ue o sinal de um n=mero in(eiro de*ende do seu bi( mais signi8ica(i.o%
➠ i.is$o: Precisamos (omar cuidado com a di.is$o *elo seguin(e mo(i.o: Se o resul(ado n$o couber no regis(rador des(ino3 um erro de ,i.ision by 4ero, ocorrer' #is(o n$o es(' *er8ei(amen(e documen(ado nos di.ersos manuais +ue li en+uan(o es(uda.a assembly 02D999 Vim a descobrir es(e mace(e numa an(iga edi$o da re.is(a PC AXA^NE americana&9 u(ro cuidado 6 com o di.isor999 se 8or 0 o mesmo erro ocorrer'% A di.is$o *ode ser 8ei(a en(re um n=mero de LG bi(s e um de 1D ou en(re um de 1D e um de 3 .e@a a (abela:
MO │ A B W e res(o │ h │ A │ B │ e res(o│ h │ LG bi(s │ 1D bi(s │ 1D bi(s │ │ │ │ │ │ 1D bi(s │ bi(s │ bi(s │ Q
Assim como na mul(i*lica$o arma4enado em H e AH9
o
n=mero
#di.idendo& de LG bi(s 6
e*ois da di.is$o o +uocien(e 6 arma4enado em A! e o res(o em A] #no caso de di.is$o 1D bi(s& ou o +uocien(e 8ica em AH e o res(o em H #no caso de di.is$o LG bi(s&9 E2em*lo da sin(a2e: MO │ V CH AH W H:AH CH3 H W res(o │ │ V B! A! W AH B!3 A] W res(o │ Q *rimeiro caso 6 uma di.is$o sem sinal e o segundo com sinal9 No(e os di.isores #CH e B! no nosso e2em*lo&9 Na di.is$o 1D bi(s o di.idendo 6 arma4enado em di.is$o999 No caso de LG bi(s H e AH s$o usados999 ais um de(al5e: s 8lags3 de*ois di.is$o n$o de.em ser considerados9
de
AH
an(es
da
uma mul(i*lica$o ou
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 0[ ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra Algumas ins(ru;es a8e(am somen(e aos 8lags9 en(re elas3 as mais u(ili4adas s$o as ins(ru;es de com*ara$o en(re dois dados9
➠ Com*ara;es ari(im6(icas: A ins(ru$o CP 6 usada +uando se +uer com*arar dois dados3 a8e(ando somen(e aos 8lags9 Eis a sin(a2e: MO │ CP A!31F5 │ │ CP ES:jk31 │ │ CP AH3jSk │ Q Es(a ins(ru$o 8a4 a sub(ra$o en(re o o*erando mais a es+uerda e o mais a direi(a3 a8e(ando somen(e os 8lags9 Por e2em*lo3 se os dois o*erandos (i.erem .alores iguais a sub(ra$o dar' .alores iguais e o 8lag de ^ER ser' 19 Eis a mecnica de CP: MO │ CP A!31F5 A! 7 1F53 a8e(ando somen(e os Flags │ Q
➠ Com*ara;es l)gicas: A ins(ru$o TEST 6 usada +uando se +uer com*arar de(erminados bi(s de um o*erando9 Eis a sin(a2e:
o
es(ado
de
MO │ TEST A!310000000b │ │ TEST jBHk300001000b │ Q Es(a ins(ru$o 8a4 um AN com os dois o*erados3 a8e(ando a*enas os 8lags9 s 8lags ^3 S e P s$o a8e(ados3 os 8lags e C ser$o 4erados9
➠ ns(ru;es +ue mudam o es(ado dos 8lags dire(amen(e:
C!C 7 Abre.ia$o de C!ear Carry #^era o 8lag Carry&9 C! 7 Abre.ia$o de C!ear irec(ion #A@us(a 8lag de dire$o em 4ero3 es*eci8icando o sen(ido corre(o *ara ins(ru;es de bloco&9 C! 7 Abre.ia$o de C!ear n(erru*( #ascara 8lag de in(erru*$o3 n$o *ermi(indo +ue a CP/ recon5ea as in(erru*;es mascar'.eis&9 CC 7 Abre.ia$o de Co*lemen( Carry #n.er(e o 8lag de carry&9 STC 7 Abre.ia$o de SeT Carry #Fa4 carry W 1&9 ST 7 Abre.ia$o de SeT irec(ion #8lag de dire$o se(ado 7 indica +ue as ins(ru;es de bloco incremen(ar$o os seus *oin(ers no sen(ido con(r'rio 7 de cima *ara bai2o&9 ST 7 Abre.ia$o de SeT n(erru*( #Fa4 com +ue a CP/ .ol(e a recon5ecer as in(erru*;es mascar'.eis&9
/ma in(erru*$o 6 um ,des.io, 8ei(o *ela CP/ +uando um dis*osi(i.o re+uer a a(en$o da mesma9 Por e2em*lo3 +uando .oc? digi(a uma (ecla3 o circui(o do (eclado re+uisi(a a a(en$o da CP/3 +ue *or sua .e43 *ara o +ue es(' 8a4endo e e2ecu(a uma ro(ina corres*onden(e re+uisi$o 8ei(a *elo dis*osi(i.o #ou se@a3 a ro(ina da in(erru*$o&9 Ao 8inal da ro(ina3 a CP/ re(orna (are8a +ue es(a.a desem*en5ando an(es da in(erru*$o9 Nos PCs3 TAS as in(erru*;es s$o mascar'.eis #*odem ser a(i.adas e desa(i.adas +uando +uisermos&3 com a =nica e2cess$o da in(erru*ao de c5ecagem do sis(ema #o 8amoso ER" PART" ERRR 6 um e2e*lo%&9
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 0 ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra Veremos agora as ins(ru;es de con(role de 8lu2o de *rograma9 A CP/ sem*re e2ecu(a ins(ru;es em se+u?ncia3 a n$o ser encon(re ins(ru;es +ue ,sal(em, *ara ou(ra *osi$o na mem)ria9 E2is(em endereo:
di.ersas
8ormas
de
,sal(ar,
*ara
um
+ue
de(erminado
➠ Sal(o incondicional: A ins(ru$o tP sim*lesmen(e sal(a *ara onde se +uer9 An(es de a*resen(ar a sin(a2e3 um de(al5e sobre codi8icaao: o*erando da ins(ru$o tP 6 um endereo na mem)ria3 mas3 como usaremos sem*re um com*ilador assembly3 necessi(amos criar um ,ro(ulo, ou ,label, *ara onde o sal(o ser' e8e(uado999 com*ilador (ra(a de calcular o endereo *ra gen(e9 Eis a sin(a2e de tP: MO │ tP A+uiG │ │ A+ui1: │ │ tP A+uiL │ │ A+uiG: │ │ tP A+ui1 │ │ A+uiL: │ Q s ,labels, s$o sem*re seguidos de dois7*on(os9 de c)digo acima3 a +uebra da se+u?ncia de e2ecu$o9
No(e3 no *edao
➠ Sal(o incondicional: i8eren(e de tP3 (emos ins(ru;es +ue reali4am um sal(o somen(e se uma condi$o 8or sa(is8ei(a9 Para isso3 usa7se os 8lags9 A sin(a2e dessas ins(ru;es de*ende da condi$o do 8lag +ue se +uer (es(ar9 Eis a lis(agem dessas ins(ru;es: 7 7 7 7 7 7 7 7 7 7
t^ ,label, tN^ ,label, tC ,label, tNC ,label, t ,label, tN ,label, tP ,label, tPE ,label, tS ,label, tNS ,label,
f f f f f f f f f f
Sal(a Sal(a Sal(a Sal(a Sal(a Sal(a Sal(a Sal(a Sal(a Sal(a
se se se se se se se se se se
8lag 8lag 8lag 8lag 8lag 8lag 8lag 8lag 8lag 8lag
^W1 ^W0 CW1 CW0 W1 W0 PW0 #*aridade im*ar& PW1 #*aridade *ar& SW1 SW0
E2is(em ainda mais sal(os condicionais *ara 8acili(ar a .ida do *rogramador:
7 7 7 7 7 7 7 7 7 7
tE ,label, tNE ,label, tA ,label, tB ,label, tAE ,label, tBE ,label, tX ,label, t! ,label, tXE ,label, t!E ,label,
f f f f f f f f f f
tum* tum* tum* tum* tum* tum* tum* tum* tum* tum*
i8 i8 i8 i8 i8 i8 i8 i8 i8 i8
E+ual #mesmo +ue t^& No( E+ual #mesmo +ue tN^& Abo.e #sal(a se acima& Belo #sal(a se abai2o& Abo.e or E+ual #sal(a se acima ou W& Belo o8 E+ual #sal(a se abai2o ou W& Xrea(er (5an #sal(a se v& !ess (5an #sal(a se w& Xrea(er (5an or E+ual #sal(a se vW& !ess or E+ual #sal(a se wW&
A di8erena en(re tX e tA3 t! e tB 6: 7 tA e tB s$o rela(i.os a com*ara;es sem sinal9 7 tX e t! s$o rela(i.os a com*ara;es com sinal9 s sal(os condicionais (?m uma des.an(agem com rela$o aos sal(os incondicionais: deslocamen(o 6 rela(i.o a *osi$o corren(e3 is(o 63 embora no nosso c)digo o sal(o se d? na *osi$o do ,label, o assembler (radu4 esse sal(o *ara uma *osi$o ,2, by(es *ara 8ren(e ou *ara (ras em rela$o a *osi$o da ins(ru$o de sal(o999 e esse n=mero ,2, es(' na 8ai2a de 71G a 1G[ #(radu4indo isso (udo *ra +uem n$o en(endeu: N$o 6 *oss-.el sal(os mui(o longos com ins(ru;es de sal(o condicionais999 sal.o em casos es*eciais +ue e2*licarei mais (arde%&9 E2is(e ainda a ins(ru$o regis(rador CH 8or 09
tCH^9
Essa
ins(ru$o
sal(a
se
o
ais uma ins(ru$o: !P A ins(ru$o !P sal(a *ara um de(erminado endereo se o regis(rador CH 8or di8eren(e de 4ero e3 an(es de sal(ar3 decremen(a CH9 /m e2em*lo do uso des(a ins(ru$o: MO │ S/B A!3A! A! W 0 │ │ S/B 3 W 0 │ │ V CH31000 CH W 1000 │ │ !oo*1: │ │ V B"TE PTR ES:jk30 Poe 0 em ES: │ │ NC ncremen(a o o88se( #& │ │ !P !oo*1 Re*e(e a(e +ue CH se@a 0 │ Q Essa ro(ina *reenc5e os 1000 by(es a *ar(ir de ES:0 com 09 modi8icador ,B"TE PTR, na 8ren(e de ES:jk resol.e uma ambiguidade: Como *odemos saber se a ins(ru$o ,V ES:jk30, escre.er' um by(e ou um ord> Por de8aul(3 o com*ilador assume ord3 *or isso (emos +ue usar o modi8icador indicando +ue +ueremos by(e9 Re*are +ue o *edao en(re ,!oo*1, e o 8inal da ro(ina e+ui.ale a uma ins(ru$o ,REP STSB,9 Podemos (amb6m es*eci8icar uma ins(ru$o !P condicional3 bas(a acrescen(ar ^ ou N^ #ou os e+ui.alen(es E ou NE& no 8im9 s(o +uer di4er: Sal(e EN/ANT CH 8or ^ER #^& ou N 8or ^ER #N^&9 A ins(ru$o !P sem condi$o 6 a mesma coisa +ue !PN^ ou !PNE%
➠ C5amadas a sub7ro(inas: A ins(ru$o CA!! 8unciona como se 8osse a ins(ru$o XS/B do .el5o BASC9 Ela sal(a *ara a *osi$o es*eci8icada e +uando a ins(ru$o RET 8or encon(rada na sub7ro(ina a CP/ sal(a de .ol(a *ara a *r)2ima ins(ru$o +ue segue o CA!!9 A sin(a2e: MO │ CA!! ,label, │ Q Eis um e2em*lo: MO │ V A!3\ Poe numero em A! │ │ CA!! S5oNumber Sal(a *ara a subro(ina │ │ 999 │ │ │ │ S5oNumber: │ │ 999 │ │ RET Re(orna │ Q
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 0\ ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra assun(o de 5o@e 6 NTERR/PUxES9 Como @' disse an(es3 uma in(erru*$o 6 uma re+uisi$o da a(en$o da CP/ *or um dis*osi(i.o #*or e2em*lo o (eclado3 +uando a*er(amos uma (ecla% &9 A CP/ NTERRPE o *rocessamen(o normal e sal(a *ara a ro(ina +ue ,ser.e, a in(erru*$o re+uisi(ada3 re(ornando ao *on(o em +ue es(a.a ANTES da in(erru*$o +uando 8inali4ar a ro(ina de in(erru*$o9 Assim 8unciona a n-.el de 5ardare9 A no.idade nos *rocessadores NTE! da s6rie 02D 6 +ue e2is(em ins(ru;es assembly +ue E/!A a re+uisi$o de uma in(erru$o9 Essas ins(ru;es nada mais s$o +ue um ,CA!!,3 mas ao in.6s de usarmos um endereo *ara uma subro(ina3 in8ormamos o -ndice #ou o c)digo& da in(erru*$o re+uisi(ada e a CP/ se com*or(ar' como se um dis*osi(i.o (i.esse re+uisi(ado a in(erru*$o999 As ro(inas do S e da BS s$o c5amadas *or essas ins(ru;es9 Na realidade3 es(e ar(i8icio da 8am-lia NTE! 8acili(a mui(o o (rabal5o dos *rogramadores *or+ue n$o *recisamos saber onde se encon(ram as ro(inas da BS e do S na mem)ria999 Precisamos saber a*enas o -ndice da in(erru*$o de cada uma das ro(inas999 o endereo a CP/ calcula *ara n)s% Eis a sin(a2e da ins(ru$o: MO │ NT G15 │ │ NT 105 │ Q nde G15 e 105 s$o -ndices9 A CP/ sabe *ara onde sal(ar *or+ue no inicio da mem)ria de (odo PC (em uma (abela con5ecida como ,Tabela dos .e(ores de in(erru*$o,9 A CP/3 de *osse do -ndice na ins(ru$o NT3 ,*ega, o endereo corres*onden(e a esse -ndice nessa (abela e e8e(ua um CA!! di8eren(e #*or+ue o 8im de uma ro(ina de in(erru*$o (em +ue (erminar em RET e n$o em RET 7 RET 6 o RET da ro(ina de in(erru*$o 7 n(erru*( RETurn&9 Por e2em*lo999 Se *recisamos abrir um ar+ui.o3 o (rabal5o 6 en.iado ao S *ela in(erru*ao de indice G159 Se +ueremos ler um se(or do disco3 usamos a in(erru*ao de indice 1L53 e(c999 as3 nao use a ins(ruao NT sem saber e2a(amen(e o +ue es(' 8a4endo3 oJ> Pode (er resul(ados desas(rosos% /ma descri$o da maioria das in(erru*;es de so8(are dis*on-.eis nos PCs com*a(-.eis es(' dis*on-.el no li.ro ,Xuia do *rogramador *ara PC e PSG, de Pe(er Nor(on #recomendo a a+uisi$o des(e li.ro% e *re8erencia a .ersao americana%&9 u3 se *re8erir ,li(era(ura ele(ronica, recomendo o ar+ui.o ]E!PPCG19^P #.G91&3 dis*oni.el em +ual+uer bom BBS999 Ainda assim *edirei *ara o RC do ES #RBT& *ara dis*onibili4a7lo *ara FRE aos Syso*s in(eressados em ad+uiri7lo9
uan(o as in(erru;es de 5ardare #as 8amosas Rs%&999 6 assun(o meio com*le2o no momen(o e re+uer um bom con5ecimen(o de ele(ronica digi(al e do 8uncionamen(o do micr*rocessador999 no 8u(uro #*r)2imo3 es*ero%& abordarei esse assun(o9
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 10 ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra ais ins(ru;es l)gicas999 Fal(a7nos .er as in(ru;es deslocamen(o de bi(s: S]!3 S]R3 SA!3 SAR3 R!3 RR3 RC! e RCR9 A =l(ima le(ra nas ins(ru;es acima es*eci8ica ro(a$o #R W Rig5( f direi(a3 ! W !e8( f es+uerda&9
de
o sen(ido de
Para e2em*li8icar a mecnica do 8uncionamen(o dessas recorrerei a gra8icos #8ica mais 8'cil assim&9
ins(ru;es
┏━━━━━━━━━━━┓ ┃ S]! e S]R ┃ ┗━━━━━━━━━━━┛
S]!: MO MO │Carry│ │ │ 0 Q Q msb lsb
S]R:
MO MO 0 f│ │f│Carry│ Q Q msb lsb
S]R e S]! 8a4em o deslocamen(o dos bi(s em dire$o ao 8lag Carry e acrescen(am 0 no lugar do =l(imo bi( +ue 8oi deslocado9 Essa o*era$o (em o mesmo e8ei(o de mul(i*licar *or G #S]!& ou di.idir *or G #S]R& um .alor9 Com a .an(agem de n$o gas(ar (an(o (em*o +uan(o as ins(ru;es V e /!9 S]R 6 a abre.ia$o de !e8(9
S]i8(
Rig5(3
en+uando
S]! 6 a de S]i8(
┏━━━━━━━━━━━┓ ┃ SA! e SAR ┃ ┗━━━━━━━━━━━┛ SA! 8unciona da mesma maneira +ue S]!9 SAR: MO │ MO MO Qf│ │f│Carry│ Q Q msb lsb SAR desloca (odos os bi(s *ara a direi(a #o lsb .ai *ara o 8lag carry& e re*e(e o con(e=do do an(igo =l(imo bi( #+ue 8oi deslocado&9 SAR
6
a
abre.ia$o
de
S]i8(
Ari(5me(ic
Rig5(9
Sendo
um
deslocamen(o ari(im6(ico3 n$o *oderia de desconsiderar o sinal do dado deslocado #dai o mo(i.o de re*e(ir o bi( mais signi8ica(i.o%&9
┏━━━━━━━━━━━┓ ┃ RC! e RCR ┃ ┗━━━━━━━━━━━┛
RC!: MO │ │ │ MO MO │ Q7│Carry││ │ Q Q msb lsb
RCR:
MO │ │ │ MO MO │ Q7f│ │f│Carryh Q Q msb lsb
RCR e RC! ro(acionam o dado ,*assando *elo carry,9 s(o signi8ica +ue o bi( menos signi8ica(i.o #no caso de RR& ser' colocado no 8lag de carry e +ue o con(e=do an(igo des(e 8lag ser' colocado no bi( mais signi8ica(i.o do dado9
┏━━━━━━━━━━━┓ ┃ R! e RR ┃ ┗━━━━━━━━━━━┛
R!:
RR:
MO │ │ MO │ MO │ │Carry││ │ Q Q msb lsb
MO │ │ │ MO │ MO Qf│ │f│Carry│ Q Q msb lsb
A+ui a ro(aao e 8ei(a da maneira corre(a999 o 8lag de carry a*enas indica o ul(imo bi( +ue ,saiu, e 8oi *ara o ou(ro lado999 A sin(a2e dessas ins(ru;es 6 a seguin(e:
MO │ S]! AH31 │ │ S]R B!31 │ │ RC! H3C! │ │ R! ES:jk3C! │ Q No(e +ue o segundo o*erando 6 um con(ador do n=mero de ro(a;es ou s5i8(s ser$o e8e(uadas9 Nos micro*rocessadores 0GD em dian(e *ode7se usar um .alor di8eren(e de 13 no 00D n$o *ode% Re*are (amb6m +ue *odemos usar APENAS o regis(rador C! como o*erando da direi(a se +uisermos usar algum regis(rador%
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 11 ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra ais ins(ru;es de com*ara$o999
➠ CPSB e CPS< Essas ins(ru;es com*aram #da mesma 8orma +ue CP& o con(e=do da mem)ria a*on(ada *or S:S com o con(e=do a*on(ado *or ES:3 a8e(ando os 8lags9 Com isso3 soluciona7se a limi(a$o da ins(ru$o CP com rela$o aos dois o*erandos como re8er?ncias mem)ria% !embre7se +ue S:S 6 o o*erando im*lici(o FNTE3 en+uan(o ES: 6 o des(ino9 A com*ara$o 6 8ei(a de ES: *ara S:S9 A ro(ina abai2o 6 e+ui.alen(e a CPSB: MO │ V A!3ES:jk │ │ CP A!3jSk │ │ NC S │ │ NC │ Q E2is(e um *e+uenino erro de l)gica na ro(ina acima3 aos nossos *ro*)si(os de ilus(rar o +ue ocorre em CPSB9
mas
ser.e
S e ser$o incremen(ados #ou decremen(ados3 de*ende do 8lag de dire$o& de*ois da o*era$o3 e o incremen(o #ou decremen(o& de*ender' da ins(ru$o999 !embre7se +ue CPSB com*ara By(es e CPS< com*ara
➠ SCASB e SCAS< Essas ins(ru;es ser.em *ara com*arar #da mesma 8orma +ue CP o 8a4& o con(e=do da mem)ria a*on(ado *or S:S com o regis(rador A! #no caso de SCASB& ou AH #no caso de SCAS<&9 s 8lags s$o a8e(ados e S 6 incremen(ado #ou decremen(ado& de acordo com a ins(ru$o usada9
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Com*arando blocos de mem)ria: ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ Podemos usar CPS> e SCAS> #onde > e B ou <& em con@un(o com REP *ara com*ararmos blocos #CPS>& ou *rocurar *or um de(erminado dado num bloco #SCAS>&9 A di8erena a+ui 6 +ue *odemos 8ornecer uma condi$o de com*ara$o ou busca9 Acrescen(ando o modigicador REP3 *recisamos di4er uma dessas ins(ru;es a +uan(idades de dados +ue +ueremos mani*ular999 8a4emos isso a(ra.6s do regis(rador CH #assim como 8i4emos com !S> e STS>&:
MO │ Cer(i8ica7se do sen(ido crescen(e% │ │ C! │ │ │ │ b(6m o segmen(o da lin5a de comando e coloca em S │ │ V AH3SEX !N]AECAN │ │ V S3AH │ │ │ │ b(6m o o88se( inicial da lin5a de comando │ │ V S3FFSET !N]AECAN │ │ │ │ Procura3 no m'2imo *or 1G by(es │ │ V CH31G │ │ │ │ Procuraremos *or um es*ao9 │ │ V A!3 │ │ │ │ REPNE SCASB │ Q Esse 8ragmen(o de c)digo ilus(ra o uso de SCASB com blocos9 modi8icador REPNE signi8ica #REPe(e 5ile No( E+ual 7 Re*e(e en+uan(o n$o 8or igual&9 REPNE garan(e +ue o by(e .ai ser *rocurado *or (oda a lin5a de comando a(6 +ue o *rimeiro es*ao se@a encon(rado9 Se n$o 5ou.er es*aos na lin5a3 en($o3 de*ois de 1G by(es de *rocura3 o regis(rador CH es(ar' 4erado #@' +ue 6 decremen(ado a cada by(e com*arado&9 Es(a 6 ou(ra carac(er-s(ica das ins(ru;es +ue mani*ulam blocos #as +ue s$o *recedidas de REP3 REPNE ou REPE&: con(ador 6 decremen(ado a cada o*era$o da ins(ru$o associada #no nosso caso SCASB&3 bem como os demais o*erandos im*lici(os #S no caso acima& 6 incremen(ado a cada *asso9 Se +uisermos encon(rar ro(ina acima3 bas(a (rocar X/A!&9
o *rimeiro by(e FERENTE de es*ao na REPNE *or REPE #Re*e(e en+uan(o 8or
REPE e REPNE n$o 8oram mencionados an(es com !S> e STS>9
*or+ue
n$o
8uncionam
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 1G ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra A *ar(ir de agora .eremos3 resumidamen(e3 como desen.ol.er 8un;es*rocedures em assembly no mesmo c)digo PASCA!9 T/RB PASCA! #a *ar(ir da .ersao D90& 8ornece algumas *ala.ras7c5a.e dedicadas cons(ru$o de ro(inas assembly in7line #esse recurso 6 c5amado de BAS nos manuais do T/RB PASCA! 7 BAS 6 a abre.ia$o de Borland ASsebler&9 An(es de comearmos a .er o nosso *rimeiro c)digo em assembly .ale a *ena ressal(ar alguns cuidados em rela$o a codi8ica$o de ro(inas assembly em T/RB PASCA!999 As nossas ro(inas de.em:
➠ Preser.ar sem*re o con(e=do dos regis(radores S3 BP e SP9 ➠ Nunca modi8icar3 dire(amen(e3 o con(e=do dos regis(radores CS3 P e SS9
mo(i.o dessas res(ri;es 6 +ue os regis(radores BP3 SP e SS s$o usados na ob(en$o dos .alores *assados como *arame(ros 8un$o*rocedure e na locali4a$o das .aria.eis globais na mem)ria9 regis(rador S 6 usado *or (odo o c)digo PASCA! e a*on(a sem*re *ara o segmen(o de dados corren(e #o +ual n$o sabemos onde se encon(ra999 dei2e +ue o c)digo PASCA! (ome con(a disso%&9 Com rela$o ao con(e=do de CS e P3 n$o 6 uma boa *r'(ica #nem mesmo em c)digos assembly *uros& al(erar o seus .alores9 ei2e +ue as ins(ru;es de sal(o e c5amada de subro(inas 8aam isso *or .oc?%&9 s
demais
regis(radores
*odem
ser
al(erados a .on(ade9
A 8un$o ]e2By(e#& abai2o 6 um e2em*lo de 8un$o (o(almen(e escri(a em assembly999 Ela (oma um .alor de bi(s e de.ol.e uma s(ring de G by(es con(endo o .alor 5e2adecimal desse *arame(ro:
MO │ F/NCTN ]e2By(e#a(a : By(e& : S(ring ASSEB!ER │ │ AS │ │ !ES 3zResul( { A*on(a *ara o inicio da s(ring9 | │ │ │ │ V A!3G { A@us(a (aman5o da s(ring em G9 | │ │ STSB │ │ │ │ V A!3a(a { Pega o dado a ser con.er(ido9 | │ │ │ │ V B!3A! { Sal.a7o em B!9 | │ │ S]R A!31 { Para man(er com*a(ibilidade com | │ │ S]R A!31 { os micro*rocessadores 00D | │ │ S]R A!31 { nao 6 *ruden(e usar S]R A!3I9 | │ │ S]R A!31 │ │ A A!30 { Soma com ASC 09 | │ │ CP A!3\ { aior +ue ASC \> | │ │ tBE zNoAdd1 { 999 Nao 63 en($o nao soma [9 | │ │ A A!3[ { 999 3 en($o soma [9 | │ │ zNoAdd1: │ │ V A]3A! { Sal.a A! em A]9 | │ │ │ │ V A!3B! { Pega o .alor an(igo de A! em B!9| │ │ AN A!31111B { ^era os I bi(s su*eriores de A!9| │ │ A A!30 { Soma com ASC 09 | │ │ CP A!3\ { aior +ue ASC \> | │ │ tBE zNoAddG { 999 Nao 63 en($o nao soma [9 | │ │ A A!3[ { 999 3 en($o soma [9 | │ │ zNoAddG: │ │ │ │ HC]X A]3A! { Trocar A] com A! *ara gra.ar na | │ │ STS< { ordem corre(a9 | │ │ EN │ Q A *rimeira lin5a 6 a declara$o da 8un$o seguida da dire(i.a ASSEB!ER #in8ormando +ue a 8un$o TA 8oi escri(a em assembly%&9 A seguir a *ala.ra7c5a.e AS indica o inicio do bloco assembly a(6 +ue EN mar+ue o 8im da 8un$o999 A *rimeira lin5a do c)digo assembly 6: MO │ !ES 3zResul( │ Q uando re(ornamos uma s(ring numa 8un$o *recisamos con5ecer o endereo do inicio dessa s(ring9 A .ari'.el zResul( con(6m um *oin(er +ue a*on(a *ara o inicio da s(ring +ue ser' de.ol.ida numa 8un$o9 Esse endereo 6 sem*re um endereo FAR #ou se@a3 no 8orma(o SEXENT:FFSET&9 A seguir iniciali4amos o (aman5o da s(ring em G carac(eres: MO │ V A!3G │ │ STSB │ Q
No(e +ue STSB .ai gra.ar o con(e=do de A! no endereo a*on(ado *or ES:3 ou se@a3 o endereo a*on(ado *or zResul(3 e logo a*)s 6 incremen(ado3 a*on(ando *ara a *rimeira *osi$o .alida da s(ring9 m6(odo seguin(e:
+ue
usei
*ara
gerar
uma
s(ring
5e2adecimal
6
o
7 Pegamos o *arame(ro a(a e colocamos em A!9 7 Sal.a7se o con(e=do de A! em B! *ara +ue *ossamos ob(er os I bi(s menos signi8ica(i.os sem (ermos +ue ler a(a no.amen(e% 7 Com A! 8a4emos: 7 esloca7se A! I *osioes *ara a direi(a3 colocando os I bi(s mais signi8ica(i.os nos I menos signi8ica(i.os e *reenc5endo os I mais signi8ica(i.os com 0B9 #a&7 Soma7se o .alor do ASC 0 a A!9 #b&7 Veri8ica7se se o resul(ado 6 maior +ue o ASC \9 7 Se 8or3 somamos [9 7 Sal.amos o con(e=do de A! em A]9 7 Recu*eramos o .alor an(igo de A! +ue es(a.a em B!9 7 Com A! 8a4emos: 7 ^eramos os I bi(s mais signi8ica(i.os *ara ob(ermos a*enas os I menos signi8ica(i.os em A!9 7 Re*e(imos #a& e #b& 7 Trocamos A! com A] e gra.amos AH com STSB A *rimeira *ergun(a 6: Por+ue somar [ +uando o resul(ado da soma com o ASC 0 8or maior +ue o ASC \> A res*os(a *ode ser .is(a no *edao da (abela ASC abai2o: MO │ 0 1 G L I K D [ \ : w W v > z A B C E F │ ┈┈┈┈┈┈┈┈┈┈┈┈┈ │ Q │ │ E esses [ carac(eres > │ Q bser.e +ue de*ois do ASC \ segue o ASC : ao in.6s do ASC A3 como 6 dese@ado999 En(ao3 se o resul(ado da soma dos I bi(s menos sign8ica(i.os #+ue .aria de 0000B a(6 1111B 7 ou de 0 a 1K& com o ASC 0 8or maior +ue o ASC \ *recisamos com*ensar a e2is(encia dos [ carac(eres indese@'.eis% magine +ue A! se@a 09 Somando o n=mero L05& a A! ob(eriamos:
ASC
0
#+ue
e+ui.ale
ao
MO │ A! W 0010B W G5 │ │ A! W G5 Z 0 │ │ A! W G5 Z L05 │ │ A! W LG5 W G │ Q magine agora +ue A! se@a 1011B9 Fa4endo as mesmas con(as ob(eriamos A! W LB5 #+ue 6 a mesma coisa +ue o ASC 9 No en(ando3 LB5 6 maior +ue o ASC \ #ou se@a3 L\5&999 En($o:
MO │ A! W W LB5 │ │ A! W LB5 Z [5 │ │ A! W IG5 W B │ Q A ou(ra coisa +ue .oc? *oderia me *ergun(ar 6 o *or+ue eu usei a ins(ru$o HC]X A]3A! no 8inal do c)digo9 A res*os(a 6 sim*les999 s micro*rocessadores da NTE! gra.am ords na mem)ria da seguin(e maneira: MO │
Voc? de.e es(ar se *ergun(ando *or+ue n$o 8i4 a ro(ina de 8orma (al +ue a (roca de A] *or A! n$o 8osse necess'ria999
a
ro(ina3
*odemos a*ro.ei(ar ]e2By(e#& *ara
MO │ Func(ion ]e2
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 1L ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra Algumas *essoas3 de*ois de .erem o c)digo7e2em*lo do (e2(o an(erior3 desen.ol.ido *ara ser com*ilado em T/RB PASCA!3 me *ergun(aram: ,E +uan(o ao C>%,9
➠ Regras *ara a boa codigi8ica$o assembly em C Assim como no T/RB PASCA!3 de.emos: Nunca al(erar CS3 S3 SS3 SP3 BP e P9 Podemos al(erar com mui(o cuidado ES3 S e Podemos al(erar sem*re +ue +uisermos AH3 BH3 CH3 H regis(rador S sem*re a*on(a *ara o segmen(o de dados do *rograma999 Se a sua 8un$o assembly acessa alguma .ari'.el global3 e .oc? (i.er al(erado S3 a .ari'.el +ue .oc? *re(endia acessar n$o es(ar' dis*on-.el% s regis(radores SS3 SP e BP s$o usados *ela linguagem *ara em*il5ar e desem*il5ar os *arame(ros e .ari'.eis locais da 8un$o na *il5a999 al(era7los *ode causar *roblemas% *ar de regis(radores CS:P nao de.e ser al(erado *or+ue indica a *r)2ima *osi$o da mem)ria +ue con(6m uma ins(ru$o assembly +ue ser' e2ecu(ada999 Em +ual+uer *rograma ,normal, esses =l(imos dois regis(radores s$o dei2ados em *a49 No caso dos regis(radores ES3 S e 3 o com*ilador os usa na mani*ula$o de *oin(ers e +uando *recisa man(er uma .ari'.el num regis(rador #+uando se usa a *ala.ra7reser.ada ,regis(er, na declara$o de uma .ari'.el3 *or e2em*lo%&9 en(ro de uma 8un$o escri(a *uramen(e em assembly3 S e *odem ser al(erados a .on(ade *or+ue o com*ilador (ra(a de sal.a7las na *il5a #.ia P/S] S e P/S] & e3 ao (6rmino da 8un$o3 as res(aura #.ia PP e PP S&9 A mel5or 8orma de se saber se *odemos ou n$o usar um desses regis(radores em um c)digo mi2(o 6 com*ilando o *rograma e gerando uma lis(agem assembly #no BR!AN CZZ isso 6 8ei(o usando7se a c5a.e 7S na lin5a de comando%&999 8aa a an'li4e da 8un$o e .e@a se o uso desses regis(radores .ai *re@udicar alguma ou(ra *ar(e do c)digo% Se .oc? n$o +uer (er essa dor de cabea3 sim*lesmen(e an(es de usar e res(aure7os de*ois +ue os usou%
sal.e7os
➠ odelamen(o de mem)ria: mais c5a(o dos com*iladores CCZZ *ara o S7S 6 o modelamen(o de mem)ria3 coisa +ue n$o e2is(e no T/RB PASCA!% igo ,c5a(o, *or+ue esse recurso3 /E /T /T!3 nos d' algumas dores de cabea de .e4 em +uando999 s modelos CPACT3 !ARXE e ]/XE usam3 *or de8aul(3 *oin(ers do (i*o FAR #segmen(o:o88se(&9 s modelos TN"3 SA!! e E/ usam3 *or de8aul(3 *oin(ers do (i*o NEAR #a*enas o88se(3 o segmen(o de dados 6 assumido%&9 A ,c5a(isse, es(' em criarmos c)digos +ue com*ilem bem em +ual+uer modelo de mem)ria9 Feli4men(e isso 6 *oss-.el graas ao *re7*rocessador: MO │}i8 de8ined#T"N"& qq de8ined#SA!!& qq de8ined#E/&│ │ Processamen(o de *oin(ers NEAR │ │}else │ │ Processamen(o dos mesmos *oin(ers999 mas3 FAR% │ │}endi8 │ Q Concorda comigo +ue 6 meio c5a(o 8icar enc5endo a lis(agem de dire(i.as do *r67*rocessador>999 Ces( la .ie%
➠ C Z AS s com*iladores da BR!AN *ossuem a *ala.ra reser.ada ,asm,9 Ela di4 ao com*ilador +ue o +ue a segue de.e ser in(er*re(ado como uma ins(ru$o assembly9 s com*iladores da icroSo8( *ossuem o ,asm, ou o ,asm,9 A BR!AN ainda (em uma dire(i.a *ara o *r67*rocessador +ue 6 usada *ara indicar ao com*ilador +ue o c)digo de.e ser mon(ado *elo T/RB ASSEB!ER ao in.6s do com*ilador CCZZ: MO │ }*ragma inline │ Q Voc? *ode usar is(o ou en($o a c5a.e 7B da lin5a de comando do BCC999 8unciona da mesma 8orma% Voc? de.e es(ar se *ergun(ando *or+ue usar o T/RB ASSEB!ER se o *r)*rio com*ilador CCZZ *ode com*ilar o c)digo999 A555553 *or mo(i.os de CPATB!AE% Se .oc? *re(ende +ue o seu c)digo se@a com*il'.el no T/RB C G903 *or e2em*lo3 de.e incluir a dire(i.a acima%% Al6m do mais3 o TAS 8a4 uma c5ecagem mais de(al5ada do c)digo assembly do +ue o BCC999 Eis um e2em*lo de uma 8un$o4in5a escri(a em assembly: MO │ in( 8#in( H& │ │ { │ │ asm mo. a23H AH W *arame(ro H │ │ asm add a23a2 AH W G AH │ │ re(urn AH re(orna AH │ │ | │ Q
A+ui segue mais uma regra:
➠ Se a sua 8un$o *re(ende de.ol.er um .alor do (i*o ,c5ar, ou ,unsigned c5ar,3 colo+ue o .alor no regis(rador com*iladores da BR!AN& use ,re(urn A!,
A!
e
#nos
➠ Se a sua 8un$o *re(ende de.ol.er um .alor do (i*o ,in(, ou ,unsigned in(,3 colo+ue o .alor no regis(rador AH e #(amb6m nos com*iladores da BR!AN& use ,re(urn AH,
A =l(ima lin5a da 8un$o acima #,re(urn AH,& n$o 6 necess'ria3 mas se n$o a colocarmos (eremos um a.iso do com*ilador3 indicando +ue ,a 8un$o *recisa re(ornar um in(,9 Se .oc? omi(ir a =l(ima lin5a #6 o caso dos com*iladores da icroSo8( +ue n$o (em *seudo7regis(radores& e n$o ligar *ros a.isos3 a coisa 8unciona do mesmo @ei(o9 Agora .oc? de.e es(ar +uerendo saber como de.ol.er os (i*os ,long,3 ,double,3 ,8loa(,3 e(c999 (i*o ,long, #bem como ,unsigned long,& 6 sim*les:
➠ Se a sua 8un$o *re(ende de.ol.er um .alor do (i*o ,long, ou
,unsigned long,3 colo+ue os 1D bi(s mais signi8ica(i.os em H e os 1D menos signi8ica(i.os em AH9
N$o e2is(e uma 8orma de de.ol.ermos H e AH ao mesmo (em*o usando os *seudo7regis(radores da Borland3 en($o *re*are7se *ara um ,a.iso, do com*ilador999 s demais (i*os n$o s$o in(eiros999 s$o de *or(an(o3 dei2e +ue o com*ilador (ome con(a deles9
➠ Trabal5ando com *oin(ers e .e(ores: ? uma ol5ada na lis(agem abai2o:
*on(o78lu(uan(e3
MO │ unsigned ArraySi4e#c5ar s(r& │ │ { │ │}i8 de8ined#T"N"& qq de8ined#SA!!& qq de8ined#E/& │ │ asm mo. si3s(r STR W FFSET a*enas │ │}else │ │ asm *us5 ds │ │ asm lds si3s(r STR W SEXENT:FFSET │ │}endi8 │ │ │ │ asm mo. c2371 │ │Con(inuaProcurando: │ │ asm inc c2 │ │ asm lodsb │ │ asm or al3al │ │ asm @n4 Con(inuaProcurando │ │ asm mo. a23c2 │ │ │ │}i8 de8ined#CPACT& qq de8ined#!ARXE& qq de8ined#]/XE&│ │ asm *o* ds Res(aura S │ │}endi8 │ │ │ │ re(urn AH │ │ | │ Q A ro(ina acima 6 e+ui.alen(e a 8un$o s(rlen#& de ws(ring95v9 Como disse an(es3 nos modelos CPACT3 !ARXE e ]/XE um *oin(er (em o 8orma(o SEXENT:FFSET +ue 6 arma4enado na mem)ria em uma grande .ari'.el de LG bi(s #os 1D mais signi8ica(i.os s$o o SEXENT e os 1D menos signi8ica(i.os s$o o FFSET&9 Nos modelos TN"3 SA!! e E/ a*enas o FFSET 6 8ornecido no *oin(er #ele (em 1D bi(s nes(e caso&3 o SEXENT 6 o assumido em S #n$o de.emos al(er'7lo3 nes(e caso%&9 Se .oc? com*ilar essa lis(agem nos modelos CPACT3 !ARXE ou ]/XE o c)digo coloca em S:S o *oin(er #lembre7se: *oin(er 6 s) um ou(ro nome *ara ,endereo de mem)ria%,&9 Sen$o3 *recisamos a*enas colocar em S o FFSET #S @' es(' cer(o%&9 Ao sair da 8un$o3 S de.e ser o mesmo de an(es da 8un$o ser c5amada999 Por(an(o3 nos modelos ,!ARXS, #5e5e& *recisamos sal.ar S ANTES de us'7lo e res(aura7lo EPS de usado% com*ilador n$o 8a4 isso au(oma(icamen(e% N$o se *reocu*e com S sal.a so4in5o999 /m mace(e com o c)digo e2em*lo:
uso
#nes(e caso%&999 de
.e(ores
es(e sim3 o com*ilador
*ode ser mos(rado no seguin(e
MO │ c5ar ajLk │ │ in( bjLk3 cjLk │ │ long djLk │ │ │ │ .oid ini(#.oid& │ │ { │ │ in( i │ │ │ │ 8or #i W 0 i w L iZZ& │ │ ajik W bjik W cjik W djik W 0 │ │ | │ Q com*ilador gera a seguin(e 8un$o e+ui.alen(e em assembly: MO │ .oid ini(#.oid& │ │ { │ │ asm 2or si3si S W i │ │ asm @m* s5or( z1z\ │ │ z1zK0: │ │ asm mo. b23si BH W i │ │ asm s5l b231 │ │ asm s5l b231 BH W BH I │ │ asm 2or a23a2 │ │ asm mo. ord *(r jdZb2ZGk30 >% │ │ asm mo. ord *(r jdZb2k3a2 │ │ │ │ asm mo. b23si │ │ asm s5l b231 │ │ asm mo. jcZb2k3a2 │ │ │ │ asm mo. b23si >% │ │ asm s5l b231 >% │ │ asm mo. jbZb2k3a2 │ │ │ │ asm mo. jaZsik3al │ │ asm inc si │ │ z1z\: │ │ asm cm* si3L │ │ asm @l s5or( z1zK0 │ │ | │ Q uando *oderiamos (er:
MO │ .oid ini(#.oid& │ │ { │ │ asm 2or si3si S W i W 0 │ │ asm @m* s5or( z1z\ │ │ z1zK0: │ │ asm mo. b23si BH W i │ │ asm s5l b231 │ │ asm s5l b231 BH W BH I │ │ asm 2or a23a2 AH W 0 │ │ asm mo. ord *(r jdZb2ZGk3a2 modi8icado% │ │ asm mo. ord *(r jdZb2k3a2 │ │ │ │ asm s5r b231 BH W BH G │ │ asm mo. jcZb2k3a2 │ │ asm mo. jbZb2k3a2 │ │ │ │ asm mo. jaZsik3al │ │ asm inc si │ │ z1z\: │ │ asm cm* si3L │ │ asm @l s5or( z1zK0 │ │ | │ Q No(e +ue economi4amos L ins(ru;es em assembly e ainda aceleramos um (i+uin5o3 re(irando o mo.imen(o de um .alor imedia(o *ara mem)ria #o 0 de ,mo. ord *(r jdZb2ZGk30,&3 colocando em seu lugar o regis(rador AH3 +ue 8oi 4erado *re.iamen(e9 sso *arece (i.essemos:
bes(eira nes(e c)digo3 e eu concordo999
mas3 e se
MO │ .oid ini(#.oid& │ │ { │ │ 8or #i W 0 i w LG000 iZZ& │ │ ajik W bjik W cjik W djik W │ │ ejik W 8jik W gjik W 5jik W │ │ jik W @jik W Jjik W ljik W │ │ mjik W njik W ojik W *jik W │ │ rjik W sjik W (jik W ujik W │ │ .jik W 2jik W yjik W 4jik W │ │ 999 mais um mon(e de membros de .e(ores999 │ │ W H"^jik W 0 │ │ | │ Q A *erda de e8ici?ncia e o gan5o de (aman5o do c)digo seriam enormes *or causa da +uan(idade de .e4es +ue o loo* 6 e2eu(ado #LG000& e *or causa do numero de mo.imen(os de .alores imedia(os *ara mem)ria3 ,S]!,s e ,V BH3S, +ue (eriamos% Conclus$o: Em alguns casos 6 mais con.enien(e mani*ular VARS .e(ores com 8un;es escri(as em assembly999 EHEP! de codi8ica$o: sa*#& adi(i.ado :& Alguns c)digos em C +ue *recisam (rocar .ari'.el *elo de ou(ra usam o seguin(e macro:
o con(e=do de uma
MO │ }de8ine sa*#a3b& { in( ( ( W a a W b b W ( | │ Q Bem999 a macro acima 8unciona *er8ei(amen(e bem3 mas .amos dar uma ol5ada no c)digo assembly gerado *elo com*ilador *ro seguin(e *rogramin5a usando o macro sa*#&: MO │ }de8ine sa*#a3b& { in( ( ( W a a W b b W ( | │ │ │ │ in( 2 W 13 y W G │ │ │ │ .oid main#.oid& │ │ { sa*#23y& | │ Q c)digo e+ui.alen(e3 a*)s ser *re7*rocessado3 8icaria: MO │ in( 2 W G3 y W 1 │ │ .oid main#.oid& { │ │ in( ( │ │ │ │ asm mo. a232 │ │ asm mo. (3a2 │ │ asm mo. a23y │ │ asm mo. 23a2 │ │ asm mo. a23( │ │ asm mo. y3a2 │ │ | │ Q No m'2imo3 o com*ilador usa o regis(rador S ou como .aria.el (999 Poderiamos 8a4er: MO │ in( 2 W G3 y W 1 │ │ .oid main#.oid& │ │ { │ │ asm mo. a232 │ │ asm mo. b23y │ │ asm 2c5g a23b2 │ │ asm mo. 23a2 │ │ asm mo. y3a2 │ │ | │ Q Re*are +ue eliminamos uma ins(ru$o em assembly3 eliminando (amb6m um acesso mem)ria e uma .ari'.el local999 T' bom999 *ode me c5amar de c5a(o3 mas eu AR diminuir o (aman5o e aumen(ar a .elocidade de meus *rogramas usando esse (i*o de ar(i8-cio% :&
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 1I ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra A+ui es(ou eu no.amen(e%%% Nos (e2(os de ,SoundBlas(er Programming, a gen(e .ai *recisar en(ender um *ou+uin5o sobre o T/RB ASSEB!ER3 en($o 6 disso +ue .ou (ra(ar a+ui3 oJ>
*odemos usar labels com mesmo causar nen5uma con8us$o:
nome
den(ro
de
.'rias
PRCs3
sem
MO │ modelamen(o3 modo3 e(c999 │ │ !CA!S │ │ │ │ PRC F1 │ │ mo. c231000 │ │ zz!oo*1: │ │ dec c2 │ │ @n4 zz!oo*1 │ │ re( │ │ ENP │ │ │ │ PRC FG │ │ mo. c23L000 │ │ zz!oo*1: │ │ dec c2 │ │ @n4 zz!oo*1 │ │ re( │ │ ENP │ │ 999 res(o999 │ Q Re*are +ue F1 e FG usam o mesmo label #zz!oo*1&3 mas o 8a(o da dire(i.a !CA!S es(ar *resen(e in8orma ao assembler +ue elas s$o di8eren(es% t' t/PS resol.e alguns *roblemas *ara n)s: s sal(os condicionais #t^3 tN^3 tC3 tS3 e(c99& s$o rela(i.os a *osi$o a(ual #(i*o: sal(e *ara 8ren(e (an(as *osi;es a *ar(ir de onde es('%&999 Em alguns casos isso *ode causar alguns erros de com*ila$o *elo 8a(o do sal(o n$o *oder ser e8e(uado na 8ai2a +ue +ueremos999 ai en(ra o t/PS999 Ele resol.e isso al(erando o c)digo *ara +ue um sal(o incondicional se@a e8e(uado9 Em e2m*lo: Su*on5a +ue o label zz!oo*G es(e@a mui(o longe do *on(o a(ual e o sal(o abai2o n$o *ossa ser e8e(uado: MO │ tN^ zz!oo*G │ Q assembler subs(i(ui3 caso t/PS es(e@a *resen(e3 *or: MO │ t^ zzP1 │ │ tP zz!oo*G Sal(o absolu(o se N^% │ │ zzP1: │ Q A lin5a seguin(e do e2em*lo inicial in8orma ao assembler +ue o PRCedimen(o ^eraAH 6 *=blico3 ou X!BA! #.is-.el *or +ual+uer um dos m)dulos +ue o +ueira%&9 !ogo a*)s3 a dire(i.a CESEX in8orma o inicio de um segmen(o de c)digo9 En(re as dire(i.as PRC e assembly9 PRC *recisa a*enas do ais de(al5es sobre PRC abai2o9
ENP .em o cor*o de uma ro(ina em nome da 8un$o #ou PRCedimen(o&9
Finali4amos a lis(agem com EN3 marcando 9AS9
o
8im
do
m)dulo
em
Sim*les3 n6>% Su*on5a agora +ue .oc? +ueira *assar um *arame(ro *ara um PRC9 Por e2em*lo: MO │ E+ui.alen(e a: │ │ .oid *ascal Se(AH#unsigned .& { AH W . | │ │ PRCE/RE Se(AH#V:<R& BEXN regAH :W V EN │ │ EA! │ │ E! !ARXE3PASCA! │ │ !CA!S │ │ t/PS │ │ │ │ X!BA! Se(AH : PRC │ │ │ │ PRC Se(AH │ │ ARX V : <R │ │ mo. a23jVk │ │ re( │ │ ENP │ │ │ │ EN │ Q ]ummmm999 Surgiu uma dire(i.a no.a9 ARX es*eci8ica a lis(a de *arame(ros +ue de.er' es(ar na *il5a a*)s a c5amada de Se(AH #ARXumen(os de Se(AH&9 No(e +ue V es(' en(re colc5e(es na ins(ru$o mo.999 isso *or+ue V 63 na .erdade3 uma re8er?ncia mem)ria #na *il5a%& e (oda re8er?ncia mem)ria *recisa ser cercada com colc5e(es #sen$o d' um bai(a erro de sin(a2e no modo EA!%&9 e*ois da com*ila$o o assembler subs(i(ui V *ela re8er?ncia cer(a9 s (i*os3 b'sicos3 .'lidos *ara o assembler s$o: B"TE3 <R3 <R999 N$o e2is(e NTEXER3 C]AR como em PASCA! #NTEXER W <R com sinal assim como C]AR W B"TE com sinal%&9 Para
8inali4ar:
Em um =nico m)dulo *odem e2is(ir .'rios PRCs:
MO │ EA! modo EA! do TAS │ │ E! !ARXE3 PASCA! modelamen(o de mem)ria999 │ │ !CA!S │ │ t/PS │ │ │ │ 999 a+ui en(ra os X!BA!S *ara os PRCs +ue .c +ueira +ue │ │ se@am *=blicos% │ │ │ │ CESEX Comeo do segmen(o de c)digo999 │ │ │ │ PRC P1 │ │ 999 Cor*o do PRC P1 │ │ ENP │ │ │ │ PRC PG │ │ 999 Cor*o do PRC PG │ │ ENP │ │ │ │ 999 ou(ros PRCs999 │ │ │ │ EN Fim da lis(agem │ Q E2is(em /TS ou(ros de(al5es com rela$o do TAS999 mas meu ob@e(i.o no curso de AS 6 a mi2agem de c)digo999 *ls3 alguma d=.ida3 mandem mensagem *ara c' ou .ia ne(mail * mim em 1G:GG[019
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 01 ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra Con(inuando o *a*o sobre o TAS3 *recisaremos a*render como mani*ular (i*os de dados mais com*le2os do +ue <R3 B"TE ou <R9 Eis a descri$o das es(ru(uras% /ma es(ru(ura 6 o agru*amen(o de (i*os de dados sim*les em uma =nica classe de arma4enamen(o3 *or e2em*lo: MO │ STR/C yTy*e │ │ A B > │ │ B < > │ │ ENS │ Q A es(ru(ura yTy*e acima3 delimi(ada *elas *ala.ras7c5a.a STR/C e ENS3 8oi cons(ruida com dois (i*os de dados sim*les #B"TE e <R& com os nomes de A e B9 No(e +ue as lin5as acima a*enas declaram a es(ru(ura3 sem alocar es*ao na mem)ria *ara ela9 Criar uma ins(ancia dessa es(ru(ura 6 ($o sim*les +uan(o criar uma .ari'.el de (i*o sim*les: MO │ yVar yTy*e w030v │ Q A sin(a2e 6 basicamen(e a mesma de +ual+uer declara $o de .ari'.el em assembly3 com a di8erena de +ue o (i*o do dado 6 o nome #ou TAX& da es(ru(ura 7 yTy*e 7 e os dados iniciais dos elemen(os da es(ru(ura es($o locali4ados en(re os simbolos w e v9 Na lin5a acima criamos a .ari'.el yVar3 cu@os elemen(os s$o 0 e 09 Vamos a um e2em*lo de uso desse no.o (i*o:
MO │ 999 A+ui en(ra o modelamen(o3999 │ │ │ │ ATASEX │ │ │ │ yVar yTy*e w030v │ │ │ │ CESEX │ │ │ │ PRC Se(A Poe .alor em A na es(ru(ura9 │ │ ARX V : By(e │ │ mo. al3jVk │ │ mo. jyVar9Ak3al │ │ re( │ │ ENP │ │ │ │ PRC Se(B Poe .alor em B na es(ru(ura9 │ │ ARX V : as3 e se +uisermos (rabal5ar com Ve(ores de (i*os mais sim*les 6 8acil:
um
.e(or
do
(i*o
yTy*e>
MO │ ATASEX │ │ │ │ yVar1 d 10 /P #0& │ │ │ │ CESEX │ │ │ │ PRC Fill1 │ │ mo. c2310 │ │ sub b23b2 │ │ zzFillTy*e1: │ │ mo. jb2ZyVar1k30FF5 │ │ add b23G │ │ dec c2 │ │ @n4 zzFillTy*e1 │ │ re( │ │ ENP │ Q A+ui 8i4 da maneira mais di8icil a*enas *ara e2em*li8icar um m6(odo de *reenc5imen(o de .e(ores9 No caso3 BH con(6m o i(em dese@ado do .e(or9 yVar1 6 o deslocamen(o do *rimeiro i(em do .e(or na mem)ria e CH a +uan(idade de i(ens do .e(or9 No(e +ue (emos um .e(or de <RS e *recisaremos adicionar G #(amn5o de uma <R& *ara cara i(em do .e(or9 No caso da es(ru(ura3 isso 8ica um *ouco mais com*licado *or+ue ela *ode (er um (aman5o n$o m=l(i*lo de G #o +ue com*lica o c'lculo9 Por e2em*lo3 yTy*e #a es(ru(ura& (em L by(es de (aman5o9 Eis a im*lemen(a$o #n$o o(imi4ada& *ara a
ro(ina FillTy*e *ara *reenc5imen(o de um i(ens:
.e(or
de
yTy*e
com
10
MO │ ATASEX │ │ yVar yTy*e 10 du* #w030v& │ │ │ │ CESEX │ │ PRC FillTy*e │ │ mo. c2310 │ │ sub b23b2 indice *ara locali4ar i(ens9 │ │ zzFill!oo*: │ │ mo. jb2ZyVar9Ak30FF5 ns(ru$o des(acada999 │ │ mo. jb2ZyVar9Bk30FFFF5 │ │ add b23L │ │ dec c2 │ │ @n4 zzFill!oo* │ │ re( │ │ ENP │ Q Essa ro(ina merece ser obser.ada mais de *er(o: Ve@amos a ins(ru$o des(acada na lis(agem acima999 yVar9A 8ornece o deslocamen(o de A3 do *rimeiro i(em do .e(or3 na mem)ria3 en+uan(o isso BH 8ornece o indice do i(em dese@ado no .e(or9 Assim3 BHZyVar9A 8ornecer' o o88se( do elemen(o A do i(em da es(ru(ura dese@ado9
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 1D ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra /sando a mem)ria E2*andida #ES&9 ui(os mod*layers 5o@e em dia usam a mem)ria e2*andida *ara arma4enar os sam*les9 Nes(e (e2(o .eremos como 8unciona a mem)ria e2*andida e como us'7la999 A maioria dos (i*os de mem)ria:
PC7ATs
com
mais de 1b de mem)ria *ossui dois
➠ Con.encional 7 Na 8ai2a de 0 a(6 1b ➠ E2(endida: de 1b em dian(e9 A mem)ria e2(endida 6 8acilmen(e mani*ul'.el +uando um *rograma es(' em modo *ro(egido e com (oda a mem)ria ma*eada em um ou mais sele(ores9 s LDs *ermi(em +ue um sele(or acesse um segmen(o de a(6 IXb de (aman5o999 as3 n$o 6 esse o nosso caso9 Temos um *e+ueno *rograma rodando sob o S7S3 no modo real #modo na(i.o dos *rocessadores n(el&3 +ue (em acesso somen(e mem)ria con.encional9 Podemos acessar a mem)ria e2(endida a(ra.6s do dri.er ]E9S"S ou usando uma 8un$o de mo.imen(o de blocos da BS3 mas isso aumen(aria em mui(o a com*le2idade do so8(are #e3 *or consegu?ncia3 seu (aman5o&9 A !o(us3 n(el e icroso8( criaram a es*eci8ica$o ES *ara esse caso9 *rograma ELD9EHE3 ou +ual+uer ou(ro gerenciador de mem)ria como o E3 emula a mem)ria e2*andida da mesma 8orma +ue uma m'+uina com a*enas es(e (i*o de mem)ria 8aria #A mem)ria e2*andida *or 5ardare n$o 8e4 mui(o sucesso nos E/A como a mem)ria e2(endida%&9 A es*eci8ica$o ES sim*lesmen(e usa um es*ao da mem)ria con.encional #c5amado de ,Page Frame,& *ara arma4enar ,*'ginas, de 1DJb da mem)ria e2(endida9 s(o 6999 di.ida a sua mem)ria e2(endida em di.ersos blocos de 1DJ e (er' o n=mero de *'ginas #*ages& +ue *oder$o es(ar dis*on-.eis *ara uso9 E #E2*anded emory anager& sim*lesmen(e 8a4 a c)*ia das *'ginas dese@adas *ara o ,Page Frame, *ara +ue o nosso so8(are *osssa l?7las e escre.?7las3 co*iando7as de .ol(a *ara as *'ginas corre(as +uando 8i4ermos a (roca de *'ginas do ,Page Frame,9 No ,Page Frame, cabem3 normalmen(e3 I *'ginas999 8a4endo um (o(al de DIJb #ou se@a3 e2a(amen(e o (aman5o de um segmen(o%&9 Considere a 8igura abai2o:
em)ria e2(endida
em)ria e2(endida *aginada
MO │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ┈┈ Q
MO │ │Page h77 │ │Page h77 │ │Page h77 │ │Page h77 │ │Page h77 Q┈┈
0 1 G L I
J999 a mem)ria e2(endida 8oi di.idida em n *'ginas de 1DJ9 ,Page Frame, 8ica na mem)ria con.encional9 Por e2em*lo3 su*on5a +ue o ,Page Frame, es(e@a locali4ado no segmen(o 0C0005: ,Page Frame,
P'gina 8isica 0 P'gina 8isica 1 P'gina 8isica G P'gina 8isica L
MO0 │ │ h1DJ │ │ hLGJ │ │ hIJ │ │ QDIJ
o o88se( 0 a(6 1DJ71 8ica a *rimeira *'gina do ,Page Frame,3 do o88se( 1DJ a(6 LGJ71 a segunda3 e assim *or dian(e9 A es*eci8ica$o ES nos *ermi(e colocar a*enas I *'ginas no ,Page Frame,9 Assim3 o nosso *rograma escol5e cada uma das +ua(ro ,*'ginas l)gicas, +ue ser$o co*iadas da mem)ria e2(endida *ara cada uma das +ua(ro ,*'ginas 8isicas, do Page Frame9 Vale a *ena lembrar +ue o Page Frame es(' sem*re em algum lugar da mem)ria con.encional3 *or(an(o acess-.el aos *rogramas 8ei(os *ara S7S3 +ue normalmen(e (rabal5am em modo real9 A in(erru*$o D[5 6 a *or(a de en(rada *ara as 8un;es do E #ELD3 E3 LDAH3 en(re ou(ros&9 as an(es de comearmos a 8u(ucar o E *recisamos saber se ele es(' *resen(e999 Eis a ro(ina de de(ec$o do E * os com*iladores C da BR!AN:
✂ ✂ ✂ ✂ }include wio95v }include w8cn(l95v }include wdos95v }de8ine CARR"BT
#F!AXS p 0201&
b(6m a maior .ers$o do E 7 de8inida em ou(ro m)dulo% e2(ern in( emmma@orVer#.oid& Tes(a a *resena do E Re(orna 0 se E n$o *resen(e ou .ers$o w L922 Re(orna 1 se (udo oJ% in( isE*resen(#.oid& { in( 5andle Ten(a abrir o de.ice dri.er EHHHH0 *ara lei(ura% i8 ##5andle W o*en#,EHHHH0,3 BNAR" q RN!"&& WW 71& re(urn 0 N$o (em E%
Veri8ica se 6 um ar+ui.o ou dis*osi(i.o9 /sa CT! *ara isso% BH W 5andle AH W 02II00 genin(erru*(#02G1& i8 #%#H p 020&& re(urn 0 um ar+ui.o%%% N$o 6 o E% Veri8ica o dis*osi(i.o es(' oJ BH W 5andle AH W 02II0[ genin(erru*(#02G1& i8 #CARR"BT qq %A!& re(urn 0 N$o es(' oJ Veri8ica a .ers$o do E9 Para nossos *ro*)si(os (em +ue ser vW L922 i8 #emmma@orVer#& w L& re(urn 0 N$o 6 .er vW L922 Tudo oJ999 E *resen(e re(urn 1
| ✂ ✂ ✂ ✂ No *r)2imo (e2(o mos(rarei como usar o E9
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 1[ ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra Eis o e2*andida:
ar+ui.o
9AS com as ro(inas *ara mani*ula$o da mem)ria
MO │ EA! │ │ E! !ARXE3PASCA! │ │ !CA!S │ │ t/PS │ │ │ │ X!BA! emmXe(Version : PRC │ │ X!BA! emmXe(PageFrameSegmen( : PRC │ │ X!BA! emmXe(A.ailablePages : PRC │ │ X!BA! emmAllocPages : PRC │ │ X!BA! emmFreePages : PRC │ │ X!BA! emma*Page : PRC │ │ X!BA! emmXe(Error : PRC │ │ │ │ ATASEX │ │ │ │ emmVersion d 0 │ │ emmError db 0 Nen5um erro ainda999 :& │ │ │ │ CESEX │ │ │ │ b(6m a .ers$o do E9 │ │ e.ol.e no 8orma(o 020H0" #onde H 6 .ers$o e " re.is$o&9 │ │ Pro()(i*o em C: │ │ unsigned *ascal emmXe(Version#.oid& │ │ PRC emmXe(Version │ │ mo. jemmErrork30 niciali4a 8lag de erro999 │ │ mo. a53ID5 │ │ in( D[5 n.oca o E │ │ or a53a5 Tes(a o sucesso da 8un$o999 │ │ @4 zznoerror │ │ mo. jemmErrork3a5 Poe erro no 8lag999 │ │ mo. a2371 999 e re(orna %W 09 │ │ @m* zzdone │ │ mo. a53al Pre*ara 8orma(o da .ers$o9 │ │ and a23111100001111b A 8un$o ID5 do E de.ol.e │ │ mo. jemmVersionk3a2 no 8orma(o BC999 *or isso │ │ zzdone: *recisamos 8orma(ar999 │ │ re( │ │ ENP │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
Fun$o: b(6m o segmen(o do Page Frame9 Pro()(i*o em C: unsigned *ascal emmXe(PageFrameSegmen(#.oid& PRC emmXe(PageFrameSegmen( mo. a53I15 /sa a 8un$o I15 do E in( D[5 C5ama o E mo. a23b2 Poe o segmen(o em AH Fun$o I15 coloca o segmen(o do ,Page Frame, em BH9 re( ENP
│ │ │ │ │ │ │ │ │ │ │ │ Fun$o: b(6m o n=mero de *'ginas dis*on-.eis na mem)ria9 │ Pro()(i*o em C: │ unsigned *ascal emmXe(A.ailablePages#.oid& │ bs: │ N$o .eri8ica a ocorrencia de erros999 modi8i+ue se +uiser │ PRC emmXe(A.ailablePages │ mo. a53IG5 │ in( D[5 n.oca o E9 │ mo. a23b2 Poe *'ginas dis*oni.eis em AH9 │ re( │ ENP │ │ Aloca *'ginas e de.ol.e 5andle9 │ Pro()(i*o em C: │ in( *ascal emmXe(A.ailablePages#unsigned Pages& │ bs: e.ol.e 71 se 5ou.e erro na alocaao e se(a │ a .ari'.el emmError9 │ PRC emmAllocPages │ ARX Pages:<R │ mo. jemmErrork30 niciali4a 8lag de erros999 │ mo. b23jPagesk BH W n=mero de *'ginas a alocar │ mo. a53IL5 │ in( D[5 n.oca o E9 │ or a53a5 Veri8ica erro do E9 │ @4 zznoerror │ mo. jemmErrork3a5 Poe erro na .ari'.el emmError │ mo. d2371 │ zznoerror: │ mo. a23d2 re(orna c)digo de erro9 │ ou o 5andle9 │ re( │ ENP │ │ !ibera *'ginas alocadas9 │ Pro()(i*o em C: │ .oid *ascal emmFreePages#in( 5andle& │ bs: N$o .eri8ica erros999 modi8i+ue se +uiser999 │ PRC emmFreePages │ ARX 5andle:<R │ mo. d23j5andlek │ mo. a53IK5 │ in( D[5 │ re( │ ENP │ │
│ a*eia uma *'gina no Page Frame9 │ │ Pro()(i*o em C: │ │ in( *ascal emma*Page#in( 5andle3 │ │ unsigned c5ar *8Page3 │ │ unsignec PageNbr& │ │ nde: 5andle 6 o .alor de.ol.ido *ela 8un$o de aloca$o de │ │ *'ginas9 │ │ *8Page 6 o n=mero da *'gina do Page Frame #0 a(6 L&9 │ │ PageNbr 6 o n=mero da *'gina a ser colocada no │ │ Page Frame #0 a(6 m'2imo 7 1&9 │ │ e.ol.e 71 se ocorreu erro e se(a a .ari'.el emmError9 │ │ PRC emma*Page │ │ ARX 5andle:<R3 *8Page:B"TE3 PageNbr:<R │ │ mo. jemmErrork30 │ │ mo. a53II5 │ │ mo. al3j*8Pagek │ │ mo. b23jPageNbrk │ │ mo. d23j5andlek │ │ in( D[5 │ │ or a53a5 │ │ @4 zznoerror │ │ mo. jemmErrork3a5 │ │ mo. a5371 │ │ zznoerror: │ │ mo. al3a5 │ │ re( │ │ ENP │ │ │ │ Re(orna com o erro do E9 │ │ Pro()(i*o: │ │ in( *ascal emmXe(Error#.oid& │ │ PRC emmXe(Error │ │ mo. a23jemmErrork │ │ re( │ │ ENP │ │ │ │ EN │ Q Es(a 6 uma im*lemen(a$o sim*li8icada3 mas *ara nossos *ro*)si(os ser.e mui(o bem9 Algumas considera;es: A aloca$o de mem)ria .ia E n$o 6 8ei(a da mesma maneira +ue a 8un$o malloc#& de C ou Xe(em#& do T/RB PASCA!9 N$o 6 de.ol.ido nen5um *oin(er9 s(o se (orna )b.io a *ar(ir do momen(o +ue en(endemos como 8unciona o E: Toda a mani*ula$o de bancos de mem)ria 6 8ei(a de 8orma indire(a *elo Page Frame9 A 8un$o de aloca$o de.e a*enas de.ol.er um 5andle *ara +ue *ossamos mani*ular as *'ginas alocadas9 En(enda esse 5andle da mesma 8orma com +ue os ar+ui.os s$o mani*ulados999 Se +uisermos usar um banco alocado *recisamos in8ormar ao E +ual dos bancos +ueremos usar3 8a4endo isso .ia o 5andle de.ol.ido *elo *r)*rio E9 Su*on5a +ue +ueiramos alocar 1GJb da mem)ria e2*andida *ara o nosso *rograma9 Precisamos alocar *'ginas l)gicas # 1DJ W 1GJ&9 C5amariamos a 8un$o emmAllocPages#& em C da seguin(e 8orma:
MO │ }include wconio95v │ │ }include ws(dlib95v │ │ │ │ in( emm5andle │ │ │ │ .oid 8#.oid& │ │ { │ │ 999 │ │ i8 ##emm5andle W emmAllocPages#&& WW 71& { │ │ c*rin(8#,E ERRR }~d•r•n,3 emmXe(Error#&& │ │ e2i(#1& │ │ | │ │ 999 │ │ | │ Q Na 8un$o emmAllocPages#& o*(ei *or de.ol.er 71 *ara indicar o insucesso da 8un$o999 Voc? *ode arrumar um es+uema di8eren(e *ara c5egar isso #*or e2em*lo3 c5ecando a .ari'.el emmError a*)s a c5amada a 8un$o%&9 999 As *'ginas es($o sem*re numeradas de 0 a(6 o m'2imo 7 19 No nosso caso (eremos as *'ginas 0 a(6 [ dis*on-.eis ao nosso *rograma9 !embre7se +ue cada uma (em a*enas 1DJ de (aman5o e +ue *odem ser arran@adas de ++ maneira + .c +ueira no Page Frame9 Vamos usar as I *'ginas iniciais como e2em*lo999 *ara isso *recisamos ma*ea7las no Page Frame usando a 8un$o emma*Page#&9 MO │ .oid 8#.oid& │ │ { │ │ in( i │ │ │ │ 999 │ │ 8or #i W 0 i w I iZZ& │ │ emma*Page#emm5andle3i3i& │ │ | │ Q e*ois des(e *e+ueno loo* sabemos +ue +ual+uer al(era$o no con(e=do do Page Frame al(erar' as *'ginas +ue es($o ma*eadas nele999:& Sim*les n6> S) nos res(a con5ecer o endereo inicial do Page Frame: MO │ }include wdos95v │ │ │ │ .oid 8ar PageFrameAddr │ │ │ │ .oid 8#.oid& │ │ { │ │ 999 │ │ PageFrameAddr W FP#emmXe(PageFrameSegmen(#&3 0& │ │ 999 │ │ | │ Q
Ao 8im do uso da mem)ria e2*andida *recisamos dealocar o es*ao *re.iamen(e alocado999 C e CZZ dealocam au(oma(icamen(e +ual+uer es*ao alocado *or malloc#&3 calloc#& e 8un;es a8ins999 N$o 6 o caso de nossas ro(inas acima999 en($o acos(ume7se a man(er a casa em ordem e usar a 8un$o emmFree#& +uando n$o *recisar mais das *'ginas alocadas9 sso (udo n$o 8uncionar' se o E n$o es(i.er ins(alado999 No (e2(o an(erior mos(rei a ro(ina *ara de(erminar a *resena do E9 E3 no mesmo (e2(o3 a*areceu a ro(ina emmma@orVer#&9 Eis a ro(ina abai2o: MO │ in( emmma@orVer#.oid& │ │ { re(urn ##in(&emmXe(Version#& vv & | │ Q
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 1 ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra ]ummmm999 Es(amos na era dos LG bi(s999 en($o *or +ue es*erar mais *ara discu(irmos as no.idades da lin5a LD e ID> Eles n$o di8erem mui(o do irm$o menor: o 0D9 A n$o ser *elo 8a(o de serem ,maiores,9 :& 0D e 0GD (?m barramen(o de dados de 1D bi(s de (aman5o en+uan(o o LD e o ID (em de LG bi(s9 Nada mais @us(o +ue e2is(am modi8ica;es nos regis(radores (amb6m:
L1 1D 1K 0 MO │ │ A] AH A! │ h │ │ B] BH B! │ h │ │ C] CH C! │ h │ │ ] H ! │ Q
EAH EBH ECH EH
s regis(radores de uso geral con(inuam os .el5os con5ecidos de sem*re999 S) +ue e2is(em os regis(radores de uso geral de LG bi(s: EAH3 EBH3 ECH e EH3 onde os 1D bi(s menos signi8ica(i.os des(es s$o AH3 BH3 CH e H3 res*ec(i.amen(e9
L1 1D 1K 0 MO │ │ S │ h│ │ │ │ h│ │ │ BP │ h│ │ │ SP │ Q
ES E EBP ESP
a mesma 8orma3 os regis(radores S3 3 BP e SP ainda es($o a+ui999 bem como os seus e+ui.alen(es de LG bi(s: ES3 E3 EBP e ESP9 s regis(radores de segmen(o #c5amados de SE!ETRES desde o surgimen(o do 0GD& s$o os mesmos e n$o mudaram de (aman5o3 con(inuam com 1D bi(s: CS3 S3 ES e SS9 as acrecen(aram ou(ros: FS e XS9 s(o 6999 Agora e2is(e um regis(rador de segmen(o de c)digo #CS&3 um segmen(o de *il5a #SS& e +ua(ro segmen(os de dados #S3 ES3 FS e XS&9 !embrando +ue S 6 o segmen(o de dados de8aul(9 Re*are na ordem al8ab6(ica dos regis(radores de segmen(o de dados999
regis(rador ns(ruc(ion Poin(er (amb6m E (amb6m e2is(e o seu irm$o maior999 EP:
con(inua
o
mesmo999
L1 1D 1K 0 MO │ │ P │ EP Q
a mesma 8orma os F!AXS (amb6m s$o os mesmos de sem*re999 mas o regis(rador F!AXS (amb6m 8oi e2*andido *ara LG bi(s e c5amado de EF!AXS9 s sinali4adores e2(ras s$o usados em a*lica;es es*eciais #como *or e2em*lo3 c5a.eamen(o *ara modo *ro(egido3 modo .ir(ual3 c5a.eamen(o de (are8as3 e(c999&9 Alguns ou(ros regis(radores 8oram adicionados ao con@un(o: CR03 CR13 CRL3 TRI a TR[9 R0 a RL3 RD e R[ #(odos de LG bi(s de (aman5o&9 Esses no.os regis(radores s$o usados no con(role da CP/ #CR>&3 em (es(es #TR>& e EB/X #R>&9 N$o (en5o maiores in8orma;es sobre alguns deles e *or isso n$o .ou descre.?7los a+ui9 No.as ins(ru;es 8oram criadas *ara o LD e ainda ou(ras mais no.as *ara o ID #imagino +ue de.am e2is(ir ou(ras ins(ru;es es*ec-8icas *ara o Pen(ium%&9 Eis algumas delas:
➠ BSF #Bi( Scan Forard& Processador: LD ou su*erior Sin(a2e: BSF des(3src
escri$o:
Procura *elo *rimeiro bi( se(ado no o*erando ,src,9 Se encon(rar3 coloca o numero do bi( no o*erando ,des(, e se(a o 8lag ^ero9 Se n$o encon(rar3 o o*erando ,des(, con(er' um .alor inde8inido e o 8lag ^ero ser' rese(ado9 BSF *rocura o bi( se(ado comeando *elo bi( 0 do o*erando ,src,9
E2em*lo: BSF
AH3BH
➠ BSR #Bi( Scan Re.erse& Processador: LD ou su*erior Sin(a2e: BSR des(3src
escri$o:
Fa4 a mesma coisa +ue BSF3 *or6m a ordem de *rocura comea a *ar(ir do bi( mais signi8ica(i.o do o*erando ,src,9
E2em*lo: BSR
AH3BH
➠ BS
escri$o: n.er(e a ordem das ords de um regis(rador de LG bi(s9
E2em*lo: BS
➠ BT #Bi( Tes(& Processador: LD ou su*erior Sin(a2e: BT des(3src
escri$o:
Co*ia o con(e=do do bi( do o*erando ,des(, indicado *elo o*erando ,src, *ara o 8lag Carry9
E2em*lo: BT
AH3L
bser.a;es: 17 A*aren(emen(e es(a ins(ru$o n$o acei(a o*erandos de LG bi(s9 G7 No e2em*lo acima o bi( L de AH ser' co*iado *ara o 8lag Carry9
➠ BTC #Bi( Tes( And Com*lemen(& Processador: LD ou su*erior Sin(a2e:
BTC des(3src
escri$o:
ns(ru$o iden(ica do o*erando ,des(,9
BT3 *or6m com*lemen(a #in.er(e& o bi(
➠ BTR e BTS Processador: LD ou su*erior Sin(a2e: BTR des(3src BTS des(3src
escri$o:
ns(ru;es iden(icas a BT3 *or6m BTR 4era o bi( do o*erando des(ino e BTS se(a o bi( do o*erando des(ino9
➠ C #Con.er( ouble
escri$o:
E2*ande o con(e=do do regis(rador EAH *ara o *ar EH e EAH3 *reenc5endo com o bi( L1 de EAH os bi(s de EH #e2(ens$o de sinal&9
➠ C<E #Con.er(
escri$o:
Es(a ins(ru$o e2*ande o regis(rador AH *ara EAH3 considerando o sinal9 Ela 6 e+ui.alen(e a ins(ru$o C<3 *or6m n$o usa o *ar H:AH *ara isso9
➠ CPHC]X Processador: ID ou su*erior Sin(a2e: CPHC]X des(3src
escri$o:
Com*ara o acumulador #A!3 AH ou EAH 7 de*endendo dos o*erandos& com o o*erando ,des(,9 Se 8orem iguais o acumulador 6 carregado com o con(e=do de ,des(,3 caso con(r'rio com o con(e=do de ,src,9
E2em*lo: CPHC]X BH3CH
➠ NV #n.alida(e Cac5e& Processador: ID ou su*erior Sin(a2e: NV
escri$o: !im*a o cac5e in(erno do *rocessador9
➠ tECH^ Processador: LD ou su*erior bser.a$o: iden(ica a ins(ru$o tCH^3 no regis(rador e2(endido ECH #LG bi(s&9
*or6m o (es(e 6 8ei(o
➠ !XS e !FS Processador: LD ou su*erior bser.a$o: Essas ins(ru;es s$o iden(icas as ins(ru;es !ES3 *or6m (rabal5am com os no.os regis(radores de segmen(o9
!S
e
➠ VSH e V^H Processador: LD ou su*erior Sin(a2e: VSH des(3src V^H des(3src
escri$o:
ns(ru;es =(eis +uando +ueremos lidar com o*erandos de (aman5os di8eren(es9 V^H mo.e o con(e=do do o*erando ,src, *ara ,des(, #sendo +ue ,src, de.e ser menor +ue ,des(,& 4erando os bi(s e2(ras9 VSH 8a4 a mesma coisa3 *or6m co*iando o =l(imo bi( de ,src, nos bi(s e2(ras de ,des(, #con.ers$o com sinal&9
E2em*lo: /sando ins(ru;es do 0D3 *recisariamos 8a4er is(o: V V
*ara
co*iar
A!
*ara
BH
B!3A! B]30
/sando V^H *odemos sim*lesmen(e 8a4er: V^H
BH3A!
➠ ns(ru$o condicional SET Processador: LD ou su*erior Sin(a2e: SET> des( #nde > 6 a condi$o999&
escri$o: Poe 1 no o*erando des(ino Caso con(r'rio *oe 09
E2em*lo: SETN^ AH SETS EBH SET^ C!
se
a
condi$o
8or
sa(is8ei(a9
➠ S]R e S]! #ouble Precision S5i8(& Processador: LD ou su*erior Sin(a2e: S]R des(3src3coun( S]! des(3src3coun(
escri$o:
Fa4 o s5i8( *ara es+uerda #S]!& ou direi(a #S]R& do o*erando ,des(, ,coun(, .e4es3 *or6m os bi(s +ue seriam *reenc5idos com 4eros s$o *reenc5idos com o con(6udo dos bi(s do o*erando ,src,9 Eis um gr'8ico e2em*li8icando:
S]R
src des( MO MO │ hf hf Carry Q Q n 0 n 0
o*erando ,src, n$o 6 al(erado no *rocesso9 con(6m o =l(imo bi( +ue ,saiu, do o*erando ,des(,9
8lag
de
Carry
E2em*lo: S]! S]R
EAH3ECH3L AH3BH3C!
➠ ns(ru;es +ue mani*ulam blocos999 CPS3 !S3 VS3 STS3 NS e /TS se com*or(am da mesma 8orma +ue suas similares de ou 1D bi(s #CPSB3 CPS<3 e(c99&3 *or6m usam os regis(radores e2(endidos #ES3 E3 ECH3 EAH& e o*eram com dados de LG bi(s de (aman5o #ouble Como 8uncionaria uma ins(ru$o do (i*o: V
jESZLk3EAH
jRk N$o999 no modo real os segmen(os con(inuam a (er DIJ de (aman5o9 s regis(radores e2(endidos *odem ser usados a .on(ade e3 +uando usados como o88se( em um segmen(o3 os 1D bi(s su*eriores s$o ignorados9 A ins(ru$o a*resen(ada 8uncionaria da mesma 8orma +ue: V
jSZLk3EAH
jk nde e +uando de.e7se usar os no.os regis(radores de segmen(os> jRk nde e +uando .oc? +uiser9 Pense neles como se 8osse no.os
segmen(os de dados e2(ras9 us'7los se e2*lici('7los mem)ria3 *or e2em*lo:
Na realidade .oc? a*enas conseguir' numa ins(ru$o +ue 8a4 re8er?ncia
V FS:jBHk3A! jk Posso usar os regis(radores e2(endidos nas ins(ru;es normais ou a*enas nas no.as ins(ru;es> jRk Pode us'7los nas ins(ru;es ,normais,9 A n$o ser +ue a ins(ru$o n$o *ermi(a o*erandos de LG bi(s999 T5a(s all 8or no999
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº 1\ ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra i *o.o999 Es(ou re(omando o desen.ol.imen(o do curso de assembly aos *oucos e na no.a s6rie: (imi4a$o de c)digo *ara *rogramadores C9
┏━━━━━━━━━━┓ ┃ s(rlen#& ┃ ┗━━━━━━━━━━┛ A ro(ina s(rlen#& 6 im*lemen(ada com*iladores C mais 8amosos:
da
seguin(e
maneira
nos
MO │ in( s(rlen#cons( c5ar s& │ │ { │ │ in( i W 0 │ │ 5ile #sZZ& ZZi │ │ re(urn i │ │ | │ Q sso gera small3 a:
um c)digo
a*ro2imadamen(e
e+ui.alen(e3
no modelo
MO │ PRC s(rlen NEAR │ │ ARX s:PTR │ │ *us5 si *recisamos *reser.ar │ │ *us5 di S e 9 │ │ 2or di3di i W 0 │ │ mo. si3s │ │ zzs(rlenloo*: │ │ mo. al3jsik │ │ or al3al s WW •0> │ │ @4 zzs(rlene2i( sim999 8im da ro(ina9│ │ inc si sZZ │ │ inc di ZZi │ │ @m* s5or( zzs(rlenloo* re(orna ao loo*9 │ │ zzs(rlene2i(: │ │ mo. a23si coloca i em a29 │ │ *o* si recu*ara S e 9 │ │ *o* di │ │ re( │ │ ENP │ Q Eis uma im*lemen(a$o mais e8ica4:
MO │ }i8de8 T/RBC │ │ }include wdos95v nclui *seudoregis(radores │ │ }de8ine asm asm │ │ }endi8 │ │ │ │ in( S(rlen#cons( c5ar s& │ │ { │ │ asm *us5 es │ │ │ │ }i8nde8 T/RBC │ │ asm *us5 di │ │ }endi8 │ │ │ │ }i8 de8ined#!ARXE& qq de8ined#]/XE& qq de8ined#CPACT& │ │ asm les di3s │ │ }else │ │ asm mo. di3ds │ │ asm mo. es3di │ │ asm mo. di3s │ │ }endi8 │ │ │ │ asm mo. c2371 │ │ asm sub al3al │ │ asm re*ne scasb │ │ │ │ asm no( c2 │ │ asm dec c2 │ │ asm mo. a23c2 │ │ │ │ }i8nde8 T/RBC │ │ asm *o* di │ │ }endi8 │ │ │ │ asm *o* es │ │ │ │ }i8de8 T/RBC │ │ re(urn AH │ │ }endi8 │ │ | │ Q Essa no.a S(rlen#& jNo(e +ue 6 S(rlen#& e n$o s(rlen#&3 *ara n$o con8undir com a 8un$o +ue @' e2is(e na biblio(eca *adr$o%k 63 com cer(e4a3 mais r'*ida +ue s(rlen#&3 *ois usa a ins(ru$o ,re*ne scasb, *ara .arrer o .e(or a *rocura de um carac(er •03 ao in.6s de recorrer a .'rias ins(ru;es em um loo*9 nicialmen(e3 CH (em +ue (er o maior .alor *oss-.el #71 n$o sinali4ado W DKKLK&9 Essa 8un$o 8al5a no caso de s(rings mui(o longas #maiores +ue DKKLK by(es&3 dai *recisaremos usar s(rlen#&% /ma .e4 encon(rado o carac(er •0 de.emos in.er(er CH9 No(e +ue se in.er(ermos DKKLK ob(eremos 09 Acon(ece +ue o carac(er •0 (ambem 6 con(ado999 dai3 de*ois de in.er(ermos CH3 de.emos decremen('7lo (amb6m3 e2cluindo o carac(er nulo% N$o se *reocu*e com se .c usa algum com*ilador da BR!AN3 o com*ilador (ra(a de sal.'7lo e recu*er'7lo so4in5o999
┏━━━━━━━━━━┓ ┃ s(rc*y#& ┃ ┗━━━━━━━━━━┛ Embora alguns com*iladores se@am es*er(os o su8icien(e *ara usar as in(ru;es de mani*ula$o de blocos a im*lemen(a$o mais comum de s(rc*y 6: MO │ c5ar s(rc*y#c5ar des(3 cons( c5ar src& │ │ { │ │ c5ar *(r W des( │ │ 5ile #des(ZZ W srcZZ& │ │ re(urn *(r │ │ | │ Q Para maior com*reen$o a lin5a: MO │ 5ile #des(ZZ W srcZZ& │ Q Pode ser e2*andida *ara: MO │ 5ile ##des(ZZ W srcZZ& %W •0& │ Q c)digo gerado3 no modelo small3 se assemel5a a:
MO │ PRC s(rc*y │ │ ARX des(:PTR3 src:PTR │ │ *us5 si Sal.a S e │ │ *us5 di │ │ │ │ mo. si3jdes(k Carrega os *oin(ers │ │ │ │ *us5 si sal.a o *oin(er des( │ │ │ │ mo. di3jsrck │ │ │ │ zzs(rc*yloo*: │ │ mo. al3by(e *(r jdik Fa4 des( W src │ │ mo. by(e *(r jsik3al │ │ │ │ inc di ncremen(a os *oin(ers │ │ inc si │ │ │ │ or al3al A! WW 0>% │ │ @ne s5or( zzs(rc*yloo* N$o% Con(inua no loo*% │ │ │ │ *o* a2 e.ol.e o *oin(er des(9 │ │ │ │ *o* di Recu*era e S │ │ *o* si │ │ │ │ re( │ │ ENP │ Q Es(e c)digo 8oi ins(ru;es:
gerado
num
BR!AN
CZZ
I90G%
Re*are +ue as
MO │ mo. al3by(e *(r jdik Fa4 des( W src │ │ mo. by(e *(r jsik3al │ Q Poderiam ser 8acilmen(e subs(i(uidas *or um VSB se a ordem dos regis(radores de -ndice n$o es(i.esse (rocada9 Por6m a subs(i(ui$o3 nes(e caso3 causaria mais mal do +ue bem9 Num LD as ins(ru;es VSB3 VS< e VS consomem cerca de [ ciclos de m'+uina9 No mesmo micro*rocessador3 a ins(ru$o V3 mo.endo de um regis(rador *ara a mem)ria consome a*enas G ciclos9 Perderiamos L ciclos em cada i(era$o #G VS W I ciclos&9 Numa s(ring de D0000 by(es3 *erderiamos cerca de 10000 ciclos de m'+uina999 Considere +ue cada ciclo de m'+uina NA 6 cada ciclo de clocJ9 Na realidade um =nico ciclo de m'+uina e+ui.ale a alguns ciclos de clocJ 7 .amos *ela m6dia999 1 ciclo de m'+uina € G ciclos de clocJ3 no mel5or dos casos% Vamos dar uma ol5ada no mesmo c)digo no modelo !ARXE:
MO │ PRC s(rc*y │ │ ARX des(:PTR3 src:PTR │ │ !CA! (em*:PTR │ │ mo. d23jord 5ig5 des(k │ │ mo. a23jord lo des(k │ │ mo. jord 5ig5 (em*k3d2 │ │ mo. jord lo (em*k3a2 │ │ │ │ zzs(rc*yloo*: │ │ les b23jsrck │ │ │ │ inc jord lo srck │ │ │ │ mo. al3jes:b2k │ │ │ │ les b23jdes(k │ │ │ │ inc jord lo des(k │ │ │ │ mo. jes:b2k3al │ │ │ │ or al3al │ │ @ne s5or( zzs(rc*yloo* │ │ │ │ mo. d23jord 5ig5 (em*k │ │ mo. a23jord lo (em*k │ │ re( │ │ s(rc*y end* │ Q *a999 Cade os regis(radores e S>% s *oin(ers s$o carregados .arias .e4es duran(e o loo*%%% /E ESPERC% Essa s(rc*y#& 6 uma s6ria candida(a a o(imi4a$o% Eis a min5a im*lemen(a$o #assim como S(rlen#&%&:
*ara
(odos
os modelos de mem)ria
MO │ c5ar S(rc*y#c5ar des(3 cons( c5ar src& │ │ { │ │ asm *us5 es │ │ }i8 de8ined#!ARXE& qq de8ined#]/XE& qq de8ined#CPACT&│ │ asm *us5 ds │ │ asm lds si3src │ │ asm les di3des( │ │ }else │ │ asm mo. si3ds │ │ asm mo. es3si │ │ asm mo. si3src │ │ asm mo. di3des( │ │ }endi8 │ │ asm *us5 si │ │ │ │ S(rc*yloo*: │ │ asm mo. al3jsik │ │ asm mo. es:jdik3al │ │ │ │ asm inc si │ │ asm inc di │ │ │ │ asm or al3al │ │ asm @ne S(rc*yloo* │ │ │ │ asm *o* a2 │ │ }i8 de8ined#!ARXE& qq de8ined#]/XE& qq de8ined#CPACT&│ │ asm mo. a23ds │ │ asm mo. d23a2 │ │ asm *o* ds │ │ }endi8 │ │ asm *o* es │ │ | │ Q es(e @ei(o os *oin(ers s$o carregados somen(e uma .e43 os regis(radores de segmen(o S e ES s$o usados *ara con(er as com*onen(es dos segmen(os dos *oin(ers3 +ue *odem (er segmen(os di8eren(es #no modelo large%&3 e os regis(radores S e s$o usados como indices se*arados *ara cada *oin(er% A *ar(e cri(ica do c)digo 6 o in(erior do loo*9 A =nica di8erena en(re essa ro(ina e a ro(ina an(erior #a n$o ser a carga dos *oin(ers%& 6 a ins(ru$o: MO │ asm mo. es:jdik3al │ Q ue consome I ciclos de m'+uina9 Poderiamos usar a ins(ru$o STSB3 mas es(a consome I ciclos de m'+uina num LD #*or6m K num ID&9 Num ID a ins(ru$o V consome a*enas 1 ciclo de m'+uina% Por+ue V consome I ciclos nes(e caso>% Por causa do regis(rador de segmen(o e2*lici(ado% !embre7se +ue o regis(rador de segmen(o S 6 usado como de8aul( a n$o ser +ue usemos os regis(radores BP ou SP como indice%
Se .c es(' curioso sobre (em*ori4a$o de ins(ru;es asm e o(imi4a$o de c)digo3 consiga a mais no.a .ers$o do 5y*er(e2(o ]E!PPC9 Ele 6 mui(o bom9 uan(o a li.ros3 ai .$o dois:
➠ ^en and (5e ar( o8 assembly language ➠ ^en and (5e ar( o8 code o*(imi4a(ion Ambos de ic5ael Abras59 A]]]]]]]]999 Aos mais a(enciosos e e2*erien(es: N$o colo+uei o *r)logo e nem o e*-logo das ro(inas em AS in(encionalmen(e9 No(em +ue es(ou usando o modo EA! do T/RB ASSEB!" *ara n$o con8undir mais ainda o *essoal com no(a;es do (i*o: jBPZGk3 jBP7Dk3 e de(al5es do (i*o decremen(o do s(acJ *oin(er *ara aloca$o de .ari'.eis locais999 Vou dei2ar a coisa o mais sim*les *oss-.el *ara (odos999 a mesma 8orma: /m a.iso *ara os no.a(os999 NA TENTE CP!AR os c)digos em AS #A+ueles +ue come$o *or PRC&999 Eles s$o a*enas uma demons(ra$o da maneira como as 8un;es ,C, s$o (radu4idas *ara o assembly *elo com*ilador3 oJ>
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº G0 ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra m*ressionan(e como as demons(ra;es gr'8icas #ES& conseguem ser ($o r'*idas com (odas a+uelas (rans8orma;es geom6(ricas #ob@e(os mo.imen(ando7se no es*ao (ridimensional&3 musicas em bacJground3 e(c999 A com*le2idade sugere a u(ili4a$o de ro(inas em *on(o78lu(uan(e *ara os calculos ,cabeludos,999 *a% Pon(o78lu(uan(e>% as isso 6 mui(o lerdo%%%% Toma mui(o (em*o de CP/999 E nem sem*re o 8eli4 *ro*rie('rio de um microcom*u(ador (em um IDH ou um LD com co7*rocessador% Como 6 +ue esses caras conseguem (an(a .elocidade>% A res*os(a *ode es(ar num m6(odo con5ecido como ,ari(im6(ica de *on(o78i2o,3 +ue 6 o ob@e(i.o des(e (e2(o% magine +ue *ossamos escre.er decimais& da seguin(e maneira:
um
n=mero ,+uebrado, #com casas
msb lsb MO │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ Q *ar(e in(eira │ *ar(e 8racion'ria A ,casa, mais a es+uerda 6 o bi( mais signi8ica(i.o3 e a mais a direi(a o menos signi8ica(i.o9 Assim os 1D bi(s mais signi8ica(i.os #*ar(e in(eira& nos di4 a ,*ar(e in(eira, do n=mero #l)gico3 n6>&9 E os 1D bi(s menos signi8ica(i.os #*ar(e 8racion'ria& nos di4 a *ar(e 8racion'ria do n=mero #ou(ra .e43 l)gico%&9 e 8orma +ue o bi( menos signi8ica(i.o des(es LG bi(s 6 e+ui.alen(e a G ele.ado a *o(?ncia de 71D #ou se@a: 1DKKLD&9 Eis um e2em*lo: MO │ 000000000000000091000000000000000b W 09K W 1G │ │ 000000000000000090100000000000000b W 09GK W 1I │ │ 000000000000000090010000000000000b W 091GK W 1 │ │ 000000000000000091110000000000000b W 09[K │ │ 000000000000000191000000000000000b W 19K W 1 Z 1G │ │ 000000000000001190010010000111111b W #a*ro29& │ (│ 000000000000000091101110110110011b W cos#D& W 09DD #a*ro29& │ Q N$o sei se deu *ara en(ender3 mas do bi( menos signi8ica(i.o a(6 o mais signi8ica(i.o3 o e2*oen(e .ai aumen(ando3 s) +ue o bi( menos signi8ica(i.o (em e2*oen(e 71D9 Assim3 o bi( 1 (em e2*oen(e 71K3 o seguin(e 71I3 e(c999 a(6 o =l(imo3 1K9 *on(o en(re os dois con@un(os de 1D bi(s 8oi adicionado a*enas *ara 8acili(ar a .isuali4a$o no e2em*lo acima9 J999 en($o 6 *oss-.el re*resen(ar ,n=meros +uebrados, con@un(os de 1D bi(s999 a *ergun(a 6: Pra +ue>%
em
dois
Ari(im6(ica com n=meros in(eiros sem*re 6 mais r'*ida do +ue a ari(im6(ica com n=meros em *on(o78lu(uan(e9 Tendo co7*rocessador ou n$o% esmo +ue .c (en5a um IDHI 100]43 os calculos em
*on(o78lu(uan(e ser$o mais lerdamen(e e8e(uados do +ue os mesmos calculos com n=meros in(eiros #usando os regis(radores da CP/%&9 Nes(e *on(o en(ra a ari(im6(ica de *on(o78i2o #no(e +ue o ,*on(o decimal, n$o muda de *osi$o999&9 Ve@amos o +ue acon(ece se somarmos dois n=meros em *on(o 8i2o: MO │ 09GK Z 19[K W G90 │ │ │ │ 000000000000000090100000000000000b W 09GK │ │ Z 000000000000000191100000000000000b W Z 19[K │ │ 77 │ │ 000000000000001090000000000000000b W G900 │ Q Realmen(e sim*les999 6 a*enas uma soma bin'ria999 Su*on5a +ue (en5amos um n=mero em *on(o 8i2o no regis(rador EAH e ou(ro no EH9 c)digo *ara somar os dois n=meros 8icaria ($o sim*les +uan(o: MO │ A EAH3EH │ Q mesmo ocorre na sub(ra$o999 !)gicamen(e3 a sub(ra$o 6 uma adic$o com o segundo o*erando com*lemen(ado #com*lemen(o G&3 en($o n$o 5' *roblemas em 8a4er: MO │ S/B EAH3EH │ Q A adi$o ou sub(ra$o de dois n=meros em *on(o 8i2o consome de 1 a G ciclos de m'+uina a*enas3 de*endendo do *rocessador999 o mesmo n$o ocorre com ari(im6(ica em *on(o78lu(uan(e% A com*lica$o comea a surgir na mul(i*lica$o e di.is$o de dois n=meros em *on(o78i2o9 N$o *odemos sim*lesmen(e mul(i*licar ou di.idir como 8a4emos com a soma: MO │ 000000000000000190000000000000000 │ │ 000000000000000190000000000000000 │ │ 7 │ │ 000000000000000090000000000000000 Z carry │ Q Nul(i*licando 1 *or 1 de.eriamos ob(er 13 e n$o 09 Ve@amos a mul(i*lica$o de dois .alores menores +ue 1 e maiores +ue 0: MO │ 00000000000000009100000000000000 09K │ │ 00000000000000009100000000000000 09K │ │ 7 │ │ 01000000000000009000000000000000 1DLI90 │ Q ]ummm999 o resul(ado de.eria dar 09GK9 Se di.idirmos resul(ado *or DKKLD #G1D& ob(eremos o resul(ado corre(o:
o
MO │ 01000000000000009000000000000000 vv 1D W │ │ 00000000000000009010000000000000 W 09GK │ Q A555999 mas3 e como 8icam os n=meros maiores ou iguais a 1>% A ins(ru$o /! dos micro*rocessadores LD ou su*eriores *ermi(em a mul(i*lica$o de dois in(eiros de LG bi(s resul(ando num in(eiro de DI bi(s #o resul(ado 8icar' em dois regis(radores de LG bi(s se*arados%&9 Assim3 *ara mul(i*licarmos dois n=meros em *on(o 8i2o es(abelecemos a seguin(e regra: MO │ resul(ado W #n1 nG& DKKLD ou │ │ resul(ado W #n1 nG& vv 1D │ Q Assim3 re(ornando ao *rimeiro caso de mul(i*lica$o #em 5e2a agora%&:
no(a$o
MO │ 0001900005 0001900005 W 000000010000900005 │ │ │ │ E8e(uando o s5i8( de 1D bi(s *ara a direi(a: │ │ │ │ 00010000900005 vv 1D W 0001900005 │ Q Em assembly isso seria ($o sim*les como: MO │ PRC Fi2edul │ │ ARX m1:<R3 mG:<R │ │ │ │ mo. ea23m1 │ │ mo. eb23mG │ │ imul eb2 │ │ s5rd ea23ed231D │ │ re( │ │ │ │ ENP │ Q A ins(ru$o /!3 e n$o /!3 8oi usada *or+ue os n=meros de *on(o 8i2o s$o sinali4ados #o bi( mais signi8ica(i.o 6 o sinal%&9 Vale a+ui a mesma regra de sinali4a$o *ara n=meros in(eiros: Se o bi( mais signi8ica(i.o es(i.er se(ado o n=mero 6 nega(i.o e seu .alor absolu(o 6 ob(ido a(ra.6s do seu com*lemen(o #com*lemen(o G&9 uan(o a mani*ula$o dos sinais numa mul(i*lica$o999 dei2e isso com o /!% :& A di.is$o (amb6m (em as di.is$o:
suas com*lica;es999 su*on5a a seguin(e
MO │ 0001900005 │ │ W 0000900005 #res(o W 000190005& │ │ 000G900005 │ Q
A e2*lica$o des(e resul(ado 6 sim*les: es(amos 8a4endo di.is$o de dois n=meros in(eiros999 Na ari(im6(ica in(eira a di.is$o com o di.idendo menor +ue o di.isor sem*re resul(a num +uocien(e 4ero% Eis a solu$o: Se o di.isor es(' deslocado 1D bi(s *ara es+uerda #G00005 6 di8eren(e de G3 cer(o%>&3 en($o *recisamos deslocar o di.idendo 1D bi(s *ara es+uerda an(es de 8a4ermos a di.is$o% Feli4men(e os *rocessadores LD e su*eriores *ermi(em di.is;es com di.idendos de DIbi(s e di.isores de LGbi(s9 Assim3 o deslocamen(o de 1D bi(s *ara es+uerda do di.idendo n$o 6 *roblem'(ica% MO │ 0001900005 ww 1D W 00010000900005 │ │ │ │ 00010000900005 000G900005 W 000090005 │ │ │ │ ou se@a: │ │ │ │ 1 G W 09K │ Q Eis a ro(ina em assembly +ue demons(ra esse algorri(mo: MO │ PRC Fi2edi. │ │ ARX d1:<R3 dG:<R │ │ │ │ mo. ea23d1 *ega di.idendo │ │ mo. eb23dG *ega di.isor │ │ │ │ sub ed23ed2 │ │ │ │ s5ld ed23ea231D │ │ s5l ea231D │ │ │ │ idi. eb2 │ │ re( │ │ │ │ ENP │ Q sso (udo 6 mui(o in(eressan(e3 n$o>% ]e5e5e999 mas .ou dei2ar .c mais deses*erado ainda: A di.is$o (em um ou(ro *roblema% E +uan(o aos sinais>% bi( mais signi8ica(i.o de um in(eiro *ode ser usado *ara sinali4ar o n=mero #nega(i.o W 13 *osi(i.o W 0&3 nes(e caso (eremos ainda +ue com*lemen(ar o n=mero *ara sabermos seu .alor absolu(o9 Se sim*lesmen(e 4eraramos EH e o bi( mais signi8ica(i.o es(i.er se(ado es(aremos di.idindo um n=mero *osi(i.o *or ou(ro n=mero +ual+uer #@' +ue o bi( mais signi8ica(i.o dos DIbi(s resul(an(es ser' 0%&9 Vamos com*licar mais um *ou+uin5o o c)digo da di.is$o *ara sanar es(e *roblema:
MO │ PRC Fi2edi. │ │ ARX d1:<R3 dG:<R │ │ │ │ sub cl3cl C! W 8lag │ │ WW 0 f resul(ado *osi(i.o9 │ │ %W 0 f resul(ado nega(i.o9 │ │ │ │ mo. ea23d1 *ega di.idendo │ │ │ │ or ea23ea2 6 nega(i.o>% │ │ @ns zznoc5s1 n$o% en($o n$o (roca sinal% │ │ │ │ neg ea2 6% en($o (roca o sinal e999 │ │ inc cl incremen(a 8lag9 │ │ zznoc5s1: │ │ │ │ mo. eb23dG *ega di.isor │ │ │ │ or eb23eb2 6 nega(i.o>% │ │ @ns zznoc5sG n$o% en($o n$o (roca sinal% │ │ │ │ neg eb2 6% en($o (roca sinal e999 │ │ dec cl decremen(a 8lag9 │ │ zznoc5sG: │ │ │ │ sub ed23ed2 │ │ │ │ s5ld ed23ea231D │ │ s5l ea231D │ │ │ │ di. eb2 di.is$o de .alores *osi(i.os999 │ │ 999 n$o *recisamos de idi.% │ │ │ │ or cl3cl 8lag WW 0> │ │ @4 zznoc5sL sim% resul(ado 6 *osi(i.o9 │ │ │ │ neg ea2 n$o% resul(ado 6 nega(i.o999 │ │ 999 (roca de sinal% │ │ zznoc5sL: │ │ re( │ │ │ │ ENP │ Q Se ambos os .alores s$o nega(i.os #d1 e dG& en($o o resul(ado ser' *osi(i.o9 No(e +ue se d1 6 nega(i.o C! 6 incremen(ado9 !ogo de*ois999 se dG (amb6m 6 nega(i.o3 C! 6 decremen(ado #re(ornando a 0&9 A ro(ina en($o e8e(uar' di.is$o de .alores *osi(i.os e somen(e no 8inal 6 +ue mudar' o sinal do resul(ado3 se 8or necess'rio% /ma considera$o a 8a4er 6: Como ,(rans8ormo, um n=mero em *on(o 8lu(uan(e em *on(o78i2o e .ice7.ersa>% Comecemos *ela (rans8orma$o de n=meros in(eiros em *on(o78i2o: nosso *on(o78i2o es(' si(uado e2a(amen(e no meio de uma doubleord #<R&3 o +ue nos d' 1D bi(s de *ar(e in(eira e 1D de *ar(e 8racion'ria9 A (rans8orma$o de um n=mero in(eiro *ara *on(o78i2o 6 mais +ue sim*les:
MO │ Fi2P W DKKLD ou │ │ Fi2P W ww 1D │ │ │ │ onde Fi2P W Fi2ed Poin( #Pon(o 8i2o& │ │ W n(eger #n(eiro& │ Q es(a 8orma os 1D bi(s su*eriores con(er$o o n=mero in(eiro e os 1D bi(s bi( s in8eriores in8eri ores es(ar$o es(a r$o 4erados 4era dos #um in(eiro n$o (em *ar(e 8racion'ria3 (em>%&9 Se +uisermos ob(er a com*onen(e in(eira de um n=mero de *on(o 8i2o bas(a 8a4er o s5i8( de 1D bi(s *ara direi(a9 A mesma regra *ode ser s er usada *ara (rans8orma$o de *on(o78lu(uan(e *ara *on(o78i2o3 s) +ue n$o usaremos s5i8(ing e sim mul(i*licaremos e2*lici(amen(e *or DKKLD90% Su*on5a +ue +ueiramos (rans8orma o n=mero P em *on(o78i2o: MO │ Fi2P W Floa(P DKKLD90 │ │ │ │ Fi2P W L91I1K999 DKKLD90 W G0K[9I1D1 │ │ Fi2P W G0K[ │ │ │ │ Fi2P W 000L9GIL\5 │ Q +ue nos d' uma boa a*ro2ima$o #se (rans8ormarmos LGIL\5 em *on(o 8lu(uan(e no.amen(e ob(eremos L91I1I\I[K999&9 A*enas a *ar(e in(eira do resul(ado #G0K[9I1D1& nos in(eressa9 #G0K[&9 as a*areceu um *e+uenino *roblema +ue (al.e4 .c n$o (en5a no(ado999 Su*on5a +ue o resul(ado da mul(i*lica$o *or DKKLD90 desse G0K[9DK #*or e2em*lo3 ('>%&9 Esse n=mero es(' mais *r)2imo de G0K do +ue de G0K[% Se (omarmos a*enas a com*onen(e in(eira do resul(ado ob(eremos um erro ainda maior #*on(o78i2o n$o 6 mui(o *reciso3 como .c *ode no(ar *elo e2em*lo acima%&9 Como 8a4er *ara ob(er sem*re a com*onen(e in(eira mais a*ro2imada>% A solu$o 6 somar 09K ao resul(ado da mul(i*lica$o *or DKKLD90% Se a com*onen(e 8racion'ria 8or maior ou igual a 09K en($o a soma da com*onen(e 8racion'ria com 09K dar' .alor menor +ue G90 e maior ou igual a 190 #ou se@a3 a com*onen(e in(eira dessa soma ser' sem*re 190&9 Ao con(r'rio3 se a com*onen(e 8racion'ria do resul(ado da mul(i*lica$o *or DKKLD90 8or menor +ue 09K en($o a com*onen(e in(eira da soma dessa com*onen(e *or 09K ser' sem*re 090% En($o3 somando o resul(ado da mul(i*lica$o com 09K *odemos ou n$o incremen(ar a com*onen(e in(eira de acordo com a *ro2imidade do n=mero real com o in(eiro mais *r)2imo% Se a a*ro2ima$o n$o 8or 8ei(a3 o erro gira em (orno de ou se@a: 0900001K #erro a *a(ir da +uin(a casa decimal%&9 A (rans8orma$o de um 8ica en($o:
1Ke7D3
n=mero de *on(o78lu(uan(e *ara *on(o78i2o
MO │ Fi2P W #Floa(P DKKLD90& Z 09K │ │ │ │ Fi2P W #L91I1K999 DKKLD90& Z 09K W G0K[9I1D1 Z 09K │ │ Fi2P W G0K[9\1D1 │ │ Fi2P W G0K[ #ignorando a *ar(e 8racion'ria%& │ │ │ │ Fi2P W 000L9GIL\5 │ Q A (rans8orma$o con(r'ria #de *on(o78i2o *ara *on(o78lu(uan(e& 6 menos (raum'(ica3 bas(a di.idir o n=mero de *on(o 8i2o *or DKKLD909 Eis algumas macros3 em C3 *ara as (rans8orma;es: MO │ }de8ine NTGFHE#2& ##long& ww 1D& │ │ }de8ine FHEGNT#2& ##2& vv 1D& │ │ }de8ine /B!EGFHE#2& #long##2& DKKLD90& Z 09K& │ │ }de8ine FHEG/B!E#2& ##double& DKKLD90& │ Q Ari(im6(ica de *on(o78i2o 6 recomend'.el a*enas no caso de re+uerimen(o de .elocidade e +uando n$o necessi(amos de *recis$o nos calculos9 menor n=mero +ue *odemos arma4enar na con8igura$o a(ual 6 ‚19KGK\e7K #1DKKLD& e o maior 6 ‚LG[D[9\\\\3 a*ro2imadamen(e9 N=meros maiores ou menores menor es +ue esses n$o s$o re*resen('.eis9 Se o seu *rograma *ode e2(ra*olar es(a 8ai2a3 n$o use *on(o78i2o3 * on(o78i2o3 .c ob(er' o b(er' mui(os m ui(os erros e rros de *recis$o e3 ocasionalmen(e3 (al.e4 a(6 um erro de ,i.ision By ^ero,9 A(en$o999 A im*lemen(a$o dos *rocedimen(os #PRC& acima s$o um *ou+uin5o di8eren(es *ara mi2agem de c)digo999 s com*iladores C e PASCA! a(uais u(ili4am o *ar H:AH *ara re(ornar um <R3 assim3 no 8im de cada PRC e an(es do re(orno colo+ue: MO │ s5ld ed23ea231D │ │ s5r ea231D │ Q u 8aa mel5or ainda: modi8i+ue os c)digos% Eis a min5a im*lemen(a$o *ara as ro(inas Fi2edul e Fi2edi. *ara mi2agem de c)digo com C ou T/RB PASCA!: MO │ │ │ Ar+ui.o de cabeal5o FHE9] │ │ │ │ }i8 %de8ined#FHE]& │ │ }de8ine FHET │ │ │ │ Ti*agem │ │ (y*ede8 long 8i2ed( │ │ │ │ acros de con.ers$o │ │ }de8ine NTGFHE#2& ##8i2ed(& ww 1D& │ │ }de8ine FHEGNT#2& ##in(#2& vv 1D&& │ │ }de8ine /B!EGFHE#2& ##8i2ed(##2& DKKLD90& Z 09K&& │
│ }de8ine FHEG/B!E#2& ##double& DKKLD90& │ │ │ │ eclara$o das 8un;es │ │ 8i2ed( *ascal Fi2edul#8i2ed(3 8i2ed(& │ │ 8i2ed( *ascal Fi2edi.#8i2ed(3 8i2ed(& │ │ │ │ }endi8 │ Q MO │ { /ni( Fi2edP( *ara T/RB PASCA! | │ │ /NT FHEPT │ │ │ │ {| NTERFACE {| │ │ │ │ { Ti*agem | │ │ T"PE │ │ TFi2ed W !ongn( │ │ │ │ { eclara$o das 8un;es | │ │ F/NCTN Fi2edul#13 G : TFi2ed& : TFi2ed │ │ F/NCTN Fi2edi.#13 G : TFi2ed& : TFi2ed │ │ │ │ {| P!EENTATN {| │ │ │ │ { nclui o ar+ui.o 9Bt com*ilado do c)digo abai2o | │ │ {ƒ! FHE9Bt| │ │ │ │ { eclara 8un;es como e2(ernas | │ │ F/NCTN Fi2edul#13 G : TFi2ed& : TFi2ed EHTERN │ │ F/NCTN Fi2edi.#13 G : TFi2ed& : TFi2ed EHTERN │ │ │ │ { Fim da /ni(999 sem iniciali4a;es% | │ │ EN9 │ Q MO │ FHE9AS │ │ )dulo AS das ro(inas de mul(i*lica$o e di.is$o em │ │ *on(o 8i2o9 │ │ │ │ odelamen(o de mem)ria e modo do com*ilador9 │ │ EA! │ │ E! !ARXE3PASCA! │ │ !CA!S │ │ t/PS │ │ PLD ]abili(a ins(ru;es do LD │ │ │ │ eclara os *rocedimen(os como *=blicos │ │ X!BA! Fi2edul : PRC │ │ X!BA! Fi2edi. : PRC │ │ │ │ nicio do segmen(o de c)digo9 │ │ CESEX │ │ │ │ PRC Fi2edul │ │ ARX m1:<R3 mG:<R │ │ │ │ mo. ea23jm1k │ │ mo. eb23jmGk │ │ imul eb2 │
│ s5r ea231D Coloca *ar(e 8racion'ria em AH9 │ │ H @' con(6m *ar(e in(eira% │ │ re( │ │ │ │ ENP │ │ │ │ i.is$o em *on(o 8i2o9 │ │ d1 W i.idendo3 dG W i.isor │ │ PRC Fi2edi. │ │ ARX d1:<R3 dG:<R │ │ │ │ sub cl3cl C! W 8lag │ │ WW 0 f resul(ado *osi(i.o9 │ │ %W 0 f resul(ado nega(i.o9 │ │ │ │ mo. ea23jd1k *ega di.idendo │ │ │ │ or ea23ea2 6 nega(i.o>% │ │ @ns zznoc5s1 n$o% en($o n$o (roca sinal% │ │ │ │ neg ea2 6% en($o (roca o sinal e999 │ │ inc cl incremen(a 8lag9 │ │ zznoc5s1: │ │ │ │ mo. eb23jdGk *ega di.isor │ │ │ │ or eb23eb2 6 nega(i.o>% │ │ @ns zznoc5sG n$o% en($o n$o (roca sinal% │ │ │ │ neg eb2 6% en($o (roca sinal e999 │ │ dec cl decremen(a 8lag9 │ │ zznoc5sG: │ │ │ │ sub ed23ed2 Pre*ara *ara di.is$o9 │ │ s5ld ed23ea231D │ │ s5l ea231D │ │ │ │ di. eb2 di.is$o de .alores *osi(i.os999 │ │ 999 n$o *recisamos de idi.% │ │ │ │ or cl3cl 8lag WW 0> │ │ @4 zznoc5sL sim% resul(ado 6 *osi(i.o9 │ │ │ │ neg ea2 n$o% resul(ado 6 nega(i.o999 │ │ 999 (roca de sinal% │ │ zznoc5sL: │ │ │ │ │ │ A*enas ade+ua *ara o com*ilador │ │ │ │ s5ld ed23ea231D H:AH con(6m o <R │ │ s5r ea231D │ │ │ │ re( │ │ │ │ ENP │ │ │ │ EN │ Q
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº G1 ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra l'%%999 Ac5o +ue .oc? concorda comigo +ue essa s6rie de (e2(os n$o es(aria com*le(a se eu n$o 8alasse alguma coisa a res*ei(o de *rogrma$o da *laca de .-deo VXA3 n6>% Ac5o +ue n)s (emos ra4$o em *ensar assim% :& nicialmen(e comearei a descre.er a *laca VXA3 de*ois .em as descri;es da SVXA e VESA9 N$o *re(endo gas(ar ,(rocen(as, 5oras de digi(a$o e de*ura$o de c)digo na descri$o desses *adr;es99 +uero a*enas dar uma id6ia geral do 8uncionamen(o desses dis*osi(i.os *ara +ue .oc? *ossa camin5ar com as *r)*rias *ernas mais (arde999
➠ Video Xra*5ics Array *adr$o VXA 6 o sucessor dos *adr;es EXA e CXA3 (odos criados *ela B999 A di8erena b'sica do VXA *ara os ou(ros dois 6 o aumen(o da resolu$o e de cores9 Eis uma com*ara$o dos modos de maior resolu$o e cores desses (r?s *adr;es #a+ui es($o lis(ados a*enas os modos gr'8icos%&:
MO │ │ CXA │ EXA │ VXA │ h7 │ aior resolu$o │ DI02G00 │ DI02LK0 │ DI02I0 │ h7 │ aior n=mero de │ I │ 1D │ 1D │ │ cores │#LG02G00& │ #DI02LK0& │ #DI02I0& │ │ │ │ │ │ │ │ │ │ GKD │ │ │ │ │ #LG02G00& │ Q
*adr$o VXA su*or(a a(6 GKD cores simul(anemen(e no modo de .-deo 1L5 #LG02G002GKD&9 E no modo de mais al(a resolu$o su*or(a o mesmo n=mero de cores +ue a EXA3 +ue s$o a*enas 1D9 uan(o ao n=mero de cores3 as *lacas EXA e VXA s$o mais 8le2-.eis +ue a irm$ mais .el5a #a CXA&9 As cores s$o ,re*rogram'.eis,3 is(o 63 de uma *ale((e de GKDJ cores #GKD 10GI W GDG1II cores&3 na VXA3 *odemos escol5er GKD999 uma *ale((e de DI cores *odemos usar 1D3 na EXA999 A VXA 63 sem sombra de d=.idas3 su*erior% A 8orma como *odemos selecionar essas cores (odas ser' mos(rada mais abai2o #Como sem*re as coisas boas s$o sem*re dei2adas *ra de*ois3 n6>% 5e5e&9 Em (em*o: modo DI02I0 #1D cores& ser' usado como e2em*lo nas *r)2imas lis(agens dos (e2(os da+ui *ra 8ren(e999 modo gr'8ico de LG02G00 com GKD cores ser' discu(ido em ou(ra o*or(unidade3 bem como o 8amoso E H #modo de .-deo n$o documen(ado da VXA 7 e largamen(e descri(o *or ic5ael Abras5 em seus ar(igos *ara a re.is(a r9 obbs&9
➠ em)ria de .-deo E2is(e um grande obs('culo com rela$o a modos gr'8icos de resolu;es al(as: A segmen(a$o de mem)ria% !embre7se +ue os *rocessadores n(el en2ergam a mem)ria como blocos de DIJ n$o se+uenciados #na .erdade3 sobre*os(os%&999 No modo gr'8ico de resolu$o DI02I0 da VXA #+ue su*or(a 1D cores no m'2imo&3 su*on5a +ue cada by(e da mem)ria de .-deo arma4enasse G *i2eis #1D cores *oderia e+ui.aler a I bi(s3 n$o *oderia>%&999
MO MO │ MO │ │ MO │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │L│ │ │ │Gh │ │1h │ 0 h Q
Esses s$o os +ua(ro *lanos da mem)ria de .-deo9 *lano da 8ren(e 6 o *lano 03 incremen(ando nos *lanos mais in(eriores9 Su*on5a +ue na *osi$o inicial de cada *lano (en5amos os se+uin(es by(es: MO │ Plano 0: 00101001b │ │ Plano 1: 10101101b │ │ Plano G: 11010111b │ │ Plano L: 01010100b │ Q s bi(s mais signi8ica(i.os de cada *lano 8ormam um *i2el: #0110b&3 os bi(s seguin(es o segundo *i2el #0011b&3 o (erceiro #1100b&3 e assim *or dian(e a(6 o oi(a.o *i2el #1110b&9 Como (emos 1D cores no modo DI02I03 cada *i2el (em I bi(s de (aman5o9
Com esse es+uema biru(a (emos um es*ao de a*enas LI00 by(es sendo usados *ara cada *lano de .-deo999 Se cada by(e su*or(a um bi( de cada *i2el en($o (emos +ue uma lin5a (em 0 by(es de (aman5o #DI0 &9 Se (emos I0 lin5as3 (eremos LI00 by(es *or *lano9 Tome no(a de duas coisas999 es(amos usando um modo de 1D cores como e2em*lo *ara 8acili(ar o en(endimen(o #os modos de GKD cores s$o mais com*le2os%& e esses LI00 by(es em cada *lano de bi(s 6 um es*ao de mem)ria +ue *er(ence *laca de .-deo e 6 NACESS-VE! a CP/%%%% A*enas a *laca de .-deo *ode ler e gra.ar nessa mem)ria9 A *laca VXA #e (amb6m a EXA& usam a mem)ria RA do sis(ema *ara saberem +uais *osi;es de um #ou mais& *lanos de bi(s ser$o a8e(ados9 sso 6 assun(o *ara o *r)2imo ()*ico:
➠ A mem)ria do sis(ema: s ada*(adores VXA usam o es*ao de ,mem)ria linear, en(re 0A00005 e 0BFFFF5 #(odo o segmen(o 0A0005 e (odo o segmen(o 0B0005&999 Essa mem)ria 6 a*enas uma 'rea de rascun5o3 @' +ue a *laca VXA (em mem)ria *r)*ria999 A CP/ *recisa de uma mem)ria 8isicamen(e *resen(e *ara +ue *ossa escre.erler dados999 da- a e2is(encia desses dois segmen(os con(-guos de mem)ria3 mas a VXA n$o os usa da mesma 8orma +ue a CP/% Ci(ei dois segmen(os con(-guos999 mas n$o e2is(e a limi(a$o de a*enas um segmen(o>%
➠ Selecionando os *lanos de bi(s999 Em (odos os modos de escri(a *recisamos selecionar os *lanos de bi(s +ue ser$o a8e(ados999 sso 6 8ei(o a(ra.6s de um regis(rador da *laca VXA: a*asJ999 Por6m3 an(es de sairmos 8u(ucando (udo +uan(o 6 endereo de da *laca VXA *recisamos saber C de.emos us'7los% A maioria dos regis(radores da *laca VXA es($o dis*on-.eis da seguin(e maneira: Primeiro in8ormamos *laca +ual 6 o regis(rador +ue +ueremos acessar e de*ois in8ormamos o dado a ser escri(o ou lido999 A (6cnica 6 a seguin(e: escre.emos num endereo de o n=mero do regis(rador999 no endereo seguin(e o dado *ode ser lido
ou escri(o999 No caso de a*asJ3 es(e regis(rador 6 o n=mero G do CRC/T SE/ENCAR da *laca VXA9 circui(o se+uenciador *ode ser acessado *elos endereos de LCI5 e LCK5 #LCI5 con(er' o n=mero do regis(ro e LCK5 o dado%&9 Eis a es(ru(ura do regis(ro a*asJ:
[ D K I L G 1 0 MO │>│>│>│>│ │ │ │ │ Q │ │ │ │ │ │ │ Q │ │ Q │ Q Q
*lano *lano *lano *lano
0 1 G L
e acordo com o desen5o acima999 os +ua(ro bi(s in8eriores in8ormam a *laca VXA +ual dos *lanos ser' modi8icado9 !embre7se +ue cada *lano (em um bi( de um *i2el #sendo o *lano 0 o *ro*rie('rio do bi( menos signi8ica(i.o&9 Vamos a nossa *rimeira ro(ina: M77O │ VXA19AS │ │ Com*ile com: │ │ │ │ TAS .ga1 │ │ T!N 2( .ga1 │ │ │ │ ideal │ │ model (iny │ │ locals │ │ @um*s │ │ │ │ codeseg │ │ │ │ org 1005 │ │ s(ar(: │ │ mo. a231G5 Poe no modo DI02I0 │ │ in( 105 │ │ │ │ mo. a230A0005 Fa4 ES W 0A0005 │ │ mo. es3a2 │ │ sub b23b2 BH ser' o o88se(% │ │ │ │ mo. d230LCI5 A*on(a *ara o regis(ro │ │ mo. al3G ,a*asJ, │ │ ou( d23al │ │ │ │ inc d2 ncremen(a endereo de │ │ │ │ mo. al30001b A@us(a *ara o *lano 0 │ │ ou( d23al │ │ │ │ mo. jby(e es:b2k30FF5 Escre.e 0FF5 │ │ │ │ mo. al30100b A@us(a *ara o *lano G │ │ ou( d23al │ │ │
│ mo. jby(e es:b2k30FF5 Escre.e 0FF5 │ │ │ │ sub a53a5 Es*era uma (ecla% │ │ in( 1D5 999 sen$o n$o (em graa%%% :& │ │ │ │ mo. a23L Vol(a * modo (e2(o 02GK │ │ in( 105 │ │ │ │ in( G05 Fim do *rog │ │ │ │ end s(ar( │ Q77 e*ois de com*ilar e rodar o VXA19C .oc? .ai .er uma *e+uena lin5a magen(a no can(o su*erior es+uerdo do .-deo999 Se .oc? +uiser +ue a*enas o *i2el em #030& se@a aceso3 en($o mude o .alor 0FF5 nas ins(ru;es ,mo. jby(e es:b2k30FF5, *ara 059 mo(i.o *ara isso 6 +ue cada by(e (em a*enas um bi( de um *i2el3 is(o 63 cada bi( do by(e e+ui.ale a um bi( do *i2el999 necessi(amos al(erar os +ua(ro *lanos de bi(s *ara se(armos os +ua(ro bi(s de cada *i2el #+ua(ro bi(s nos d$o 1D combina;es&999 assim3 se um by(e (em oi(o bi(s3 o *rimeiro by(e dos +ua(ro *lanos de bi(s (em os oi(o *i2eis iniciais3 sendo o bi( mais signi8ica(i.o do *rimeiro by(e de cada *lano o *rimeiro *i2el9 eu *ra no(ar +ue a*enas modi8icamos os *lanos 0 e G3 n6>% No(amos (amb6m +ue des(a maneira n$o (emos como al(erarar um =nico *i2el999 sem*re al(eraremos os oi(o *i2els%% as3 n$o se *reocu*e999 e2is(em ou(ros recursos na *laca VXA999 En(endendo o es+uema de ,*lanos de bi(s, @' es(' bom *or en+uando999 A(6 a *r)2ima999
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº GG ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra Alguma .e4 acon(eceu de .oc? (er a+uela ro(ina +uase conclu-da e +uando 8oi (es('7la .iu +ue es(a.a 8al(ando alguma coisa>% Bem999 se n$o acon(eceu .oc? 6 um sor(udo999 uando eu es(a.a comeando a en(ender o 8uncionamen(o da *laca VXA me dis*us a cons(ruir ro(inas b'sicas de (raagem de lin5as 5ori4on(ais e .er(icais999 *or6m3 +uando (in5a algum bi(ma* a(r's da lin5a acon(ecia uma desgraa%%% Par(e do bi(ma* sumia ou era subs(i(u-do *or uma su@eirin5a c5a(a% b.iamen(e eu ainda n$o (in5a dominado o 8uncionamen(o da *laca999 *or isso3 .amos con(inuar com os nossos es(udos999
➠ A mascara de bi(s e os !ATC]ES da VXA9 E2is(e uma maneira de n$o al(erarmos bi(s indese@'.eis em um by(e de cada *lano999 Su*on5a +ue +ueiramos modi8icar a*enas o bi( mais signi8ica(i.o de um by(e nos *lanos de bi(s3 dei2ando o res(an(e e2a(amen(e como es(a.am an(es%
no
=l(imo
(e2(o
+ue
o
regis(ro
a*asJ 8a4 *ar(e do
circui(o SE/ENCAR da VXA9 regis(ro Bi(asJ es(' locali4ado em ou(ro circui(o9 ais e2a(amen(e no con(rolador gr'8ico #Xra*5ics Con(roller 7 +ue c5amaremos de XC&999 8uncionamen(o 6 o mesmo do +ue o circui(o se+uenciador3 em (ermos de endereos de 3 ci(ado no =l(imo (e2(o: Primeiro de.emos in8ormar o n=mero do regis(ro e de*ois o .alor9 XC *ode ser acessado a *ar(ir do endereo de 0LCE5 e o n=mero do regis(ro Bi(asJ 6 9 Eis nosso segundo e2em*lo: MO │ VXAG9AS │ │ Com*ile com: │ │ │ │ TAS .gaG │ │ T!N 2( .gaG │ │ │ │ ideal │ │ model (iny │ │ locals │ │ @um*s │ │ │ │ codeseg │ │ │ │ org 1005 │ │ s(ar(: │ │ mo. a231G5 Poe no modo DI02I0 │ │ in( 105 │ │ │ │ mo. a230A0005 Fa4 ES W 0A0005 │ │ mo. es3a2 │ │ sub b23b2 BH ser' o o88se(% │ │ │ │ mo. d230LCI5 Seleciona *lanos 0 e G999 │ │ │ │ mo. a230K0G5 -dem a 8a4er: mo. al3G │ │ mo. a530101b │ │ │ │ ou( d23a2 │ │ │ │ mo. d230LCE5 ascara (odos os bi(s3 │ │ mo. a23005 e2ce(o o bi( [ │ │ ou( d23a2 │ │ │ │ mo. al3jby(e es:b2k carrega os la(c5es da VXA │ │ no(e +ue A! n$o nos │ │ in(eressa%%% │ │ mo. jby(e es:b2k30FF5 Escre.e 0FF5 │ │ │ │ sub a53a5 Es*era uma (ecla% │ │ in( 1D5 999 sen$o n$o (em graa%%% :& │ │ │ │ mo. a23L Vol(a * modo (e2(o 02GK │ │ in( 105 │ │ │ │ in( G05 Fim do *rog │ │ │ │ end s(ar( │ Q
Temos algumas no.idades a+ui999 Primeiro: 6 *oss-.el escre.er o n=mero de um regis(ro e o dado +uase +ue ao mesmo (em*o999 bas(a usar a ins(run$o /T H3AH 7 recorra a (e2(os an(eriores *ara .er o 8uncionamen(o dessa ins(ru$o%9 Segundo: mesmo escre.endo 0FF5 #(odos os bi(s se(ados& na mem)ria do sis(ema3 a*enas o bi( +ue n$o es(' mascarado ser' modi8icado3 graas ao Bi(asJ%% Terceiro: ais de um *lano de bi(s *ode ser al(erado ao mesmo (em*o% No(e +ue nesse c)digo escre.emos na mem)ria de .-deo a*enas uma .e4 e os *lanos 0 e G 8oram al(erados #con(inua a cor AXENTA3 n$o>%&9
➠ Problemas .is(a% J999 a*aren(emen(e a coisa 8unciona bem999 dai eu 8ao uma sim*les *ergun(a: +ue acon(eceria se o *on(o em #030& es(i.esse inicialmen(e ,branco, e usassemos a ro(ina acima>% ]ummmm999 Se o *on(o 6 branco3 a cor 6 1K999 1K 6 1111b em bin'rio3 ou se@a3 (odos os *lanos de bi(s (eriam o bi( [ do *rimeiro by(e se(ados999 A ro(ina acima ,se(a, os bi(s [ do *rimeiro by(e dos *lanos 0 e G999 assim a cor CNTN/ARA branca%% AS C S/ TES3 E/ /ER AXENTA%%% A solu$o seria colocar as seguin(es lin5as an(es ,sub a53a5, na lis(agem acima:
da
ins(ru$o
MO │ mo. d230LCI5 Seleciona os *lanos 1 e L │ │ mo. a230A0G5 │ │ ou( d23a2 │ │ │ │ mo. jby(e es:b2k30 escre.e 0 nos *lanos 1 e L │ Q Precisamos 4erar os bi(s [ dos *lanos 1 e L999 No(e +ue nas lin5as acima n$o carreguei os la(c5es da VXA a(ra.6s de lei(ura999 ali's999 n$o carreguei de 8orma alguma9 N$o *reciso 8a4er isso os la(c5es dos *lanos 1 e L n$o 8oram al(erados desde a sua =l(ima lei(ura999 re*are +ue n$o ,desmascarei, os bi(s no regis(ro Bi(asJ999 dai n$o (er a necessidade de mascar'7los de no.o999 s) *reciso escre.er 0 nos *lanos 1 e L *ara +ue o bi( [ se@a al(erado9 Pu(s999 +ue m$o7de7obra%%999 Feli4men(e e2is(em meios mais sim*les de 8a4er isso (udo999 A5555553 mas 6 claro +ue isso 8ica *ra um *r)2imo (e2(o% :&&
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº GL ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra Con8esso a (odos .oc?s +ue a e2*eri?ncia +ue .en5o (endo com rela$o a *rograma$o da *laca VXA comeou com a lei(ura de ar(igos e de um li.ro de um camarada c5amado ic5ael Abras5999 Xos(aria mui(o de conseguir ou(ros li.ros desse su@ei(o%% Ali's3 se *uderem colocar as m$os num li.r$o c5amado ,^en o8 Xra*5ics Programming,3 garan(o +ue n$o 5a.er' arre*endimen(os% um e2celen(e li.ro com /TS mace(es3 ro(inas e e2*lica;es sobre a VXA999 Tudo isso com bom 5umor%%% :& u(ra boa a+uisi$o3 *elo menos com rela$o ao ca*-(ulo 103 6 o li.ro ,Xuia do Programador *ara as *lacas EXA e VXA, da edi(ora CENCA ERNA #o au(or 6 Ric5ard E9 Ferraro&9 E2*lici(ei o ca*-(ulo 10 *or+ue ac5o +ue esse li.ro s) n$o 6 ($o bom de.ido a 8al5as de (radu$o #coisa +ue acon(ece com +uase (odos os li.ros (radu4idos no Brasil%&999 ca*-(ulo 10 6 ($o somen(e uma re8er?ncia #enorme e con8usa3 mas +uebra bem o gal5o& a (odos os regis(radores da VXA9 Esse 6 um dos li.ros +ue adoraria *oder (er o original3 em ingl?s% nde *aramos>% A555999 sim999 a(6 a+ui .imos o modo de escri(a ,normal, da *laca VXA9 Esse modo de escri(a 6 o usado *ela BS e 6 con5ecido como ,modo de escri(a 0,9 An(es de *assarmos *ra ou(ros modos de escri(a .ale a *ena .er o 8uncionamen(o de ou(ros dois regis(radores: o ,Enable Se(Rese(, e o ,Se(Rese(,9 Esses regis(ros3 como .oc? .ai .er3 8acili(a mui(o o (rabal5o de escri(a nos *lanos de bi(s9
➠ !igando e desligando bi(s999 Na lis(agem do (e2( GG .imos +ue 6 *oss-.el a escri(a em mais de um *lano de bi(s ao mesmo (em*o #bas(a 5abili(ar em a*asJ&9 Vimos (amb6m +ue os *lanos de bi(s n$o 5abili(ados *ara escri(a .ia a*asJ n$o s$o au(oma(icamen(e 4erados999 lembra7se do caso do *i2el branco +ue +ueriamos (rans8ormar em magen(a>% Com (udo isso3 (in5amos +ue 8a4er *elo menos L acessos mem)ria do sis(ema: /ma lei(ura *ara carregar os la(c5es3 uma escri(a *ara se(ar bi(s nos *lanos selecionados3 e mais uma escri(a *ara 4erar os bi(s dos ou(ros *lanos999 sso sem con(ar com os regis(radores +ue (eremos +ue a(uali4ar: a*asJ e Bi(asJ9 Sur*reenden(emen(e a ins(ru$o /T 6 uma das +ue mais consomem ciclos de m'+uina da CP/ #es*ecialmen(e nos LDs e IDs% Ve@a no seu ]E!PPC&9 Na (en(a(i.a de redu4ir os acessos mem)ria do sis(ema #e indire(amen(a aos *lanos de bi(s%&3 lanaremos m$o dos regis(radores ,Enable Se(Rese(, e ,Se(Rese(,9 Eis a descri$o deles:
✱ REXSTR ENAB!E SETRESET
[ D K I L G 1 0 MO │>│>│>│>│ │ │ │ │ Q │ │ │ │ │ │ │ Q │ │ Q │ Q Q
SR SR SR SR
bi( bi( bi( bi(
0 1 G L
✱ REXSTR SETRESET
[ D K I L G 1 0 MO │>│>│>│>│ │ │ │ │ Q │ │ │ │ │ │ │ Q │ │ Q │ Q Q
*lano *lano *lano *lano
0 1 G L
regis(rador ,Enable Se(Rese(, in8orma a *laca VXA +uais bi(s do regis(rador ,Se(Rese(, .$o ser (rans8eridos *ara os *lanos de bi(s9 No(e +ue cada bi( de ,Se(Rese(, es(' associado a um *lano de bi(s% s bi(s n$o 5abili(ados em ,Enable Se(Rese(, .ir$o da CP/ ou dos la(c5es3 de*endendo do con(e=do de Bi(asJ 7 como .imos no e2em*lo do (e2(o GG9 N$o sei se .oc? *ercebeu3 mas *odemos agora escre.er +ua(ro bi(s di8eren(es nos +ua(ro *lanos de bi(s ao mesmo (em*o999 Se se(armos os +ua(ro bi(s de ,Enable Se(Rese(,3 os +ua(ro bi(s em ,Se(Rese(, ser$o (rans8eridos *ara a mem)ria de .-deo9 Nesse caso o +ue a CP/ en.iar *ara a mem)ria do sis(ema ser' ignorado #@' +ue 6 ,Se(Rese(, +ue es(' 8ornecendo os dados%&9 s regis(radores a*asJ e Bi(asJ con(inuam 8uncionando como an(es999 Se n$o 5abili(armos um ou mais *lanos de bi(s em a*asJ3 es(e#s& *lano#s& n$o ser'#$o& a(uali4ado#s&% No(e +ue ,Enable Se(Rese(, di4 ao circui(o da *laca VXA +ue de.e ler os res*ec(i.os bi(s de ,Se(Rese(, e coloc'7los nos res*ec(i.os *lanos de bi(s999 mas3 a*asJ *ode ou n$o *ermi(ir essa (rans8er?ncia%%% uan(o ao regis(rador Bi(asJ3 .ai bem obrigado #.e@a discuss$o sobre ele no (e2(o an(erior&9 ]ummm999 .irou baguna% Agora *odemos (er dados .indos de (r?s 8on(es: da CP/ #.ia mem)ria do sis(ema&3 dos la(c5es3 e do regis(rador Se(Rese(9 Bem999 *odemos a(6 usar essa baguna em nosso 8a.or% ,Enable Se(Rese(, e ,Se(Rese(, *er(encem ao mesmo circui(o de Bi(asJ: o con(rolador gr'8ico #XC&9 S) +ue o -ndice #+ue 6 o n=mero do regis(ro no circui(o%& de ,Se(Rese(, 6 0 e de ,Enable Se(Rese(, 6 19 Vamos a um e2em*lo com esses dois regis(radores:
MO │ VXAL9AS │ │ Com*ile com: │ │ │ │ TAS .gaL │ │ T!N 2( .gaL │ │ │ │ ideal │ │ model (iny │ │ locals │ │ @um*s │ │ │ │ codeseg │ │ │ │ org 1005 │ │ s(ar(: │ │ mo. a231G5 Poe no modo DI02I0 │ │ in( 105 │ │ │ │ mo. a230A0005 Fa4 ES W 0A0005 │ │ mo. es3a2 │ │ sub b23b2 BH ser' o o88se(% │ │ │ │ mo. d230LCI5 │ │ mo. a230F0G5 a*asJ W 1111b │ │ ou( d23a2 │ │ │ │ mo. d230LCE5 │ │ mo. a23005 Bi(asJ W 10000000b │ │ ou( d23a2 │ │ mo. a230K005 Se(Rese( W 0101b │ │ ou( d23a2 │ │ mo. a230F015 Enable Se(Rese( W 1111b │ │ ou( d23a2 │ │ │ │ mo. al3jby(e es:b2k carrega os la(c5es da VXA │ │ no(e +ue A! n$o nos │ │ in(eressa%%% │ │ sso 6 necess'rio *+ .amos │ │ al(erar a*enas o bi( [9 s │ │ demais s$o 8ornecidos *elos │ │ la(c5es9 │ │ │ │ mo. jby(e es:b2k3al Escre.e +ual+uer coisa999 │ │ A! a+ui (amb6m n$o nos │ │ in(eressa3 @' +ue Se(Rese( │ │ 6 +uem manda os dados *ara │ │ os *lanos de bi(s9 │ │ │ │ sub a53a5 Es*era uma (ecla% │ │ in( 1D5 999 sen$o n$o (em graa%%% :& │ │ │ │ mo. a23L Vol(a * modo (e2(o 02GK │ │ in( 105 │ │ │ │ in( G05 Fim do *rog │ │ │ │ end s(ar( │ Q77
E2*licando a lis(agem acima: s +ua(ro *lanos s$o 5abili(ados em a*asJ999 de*ois 5abili(amos somen(e o bi( [ em Bi(asJ3 seguido *ela 5abili(a$o dos +ua(ro bi(s de ,Se(Rese(, em ,Enable Se(Rese(,9 /ma .e4 +ue os +ua(ro *lanos es($o 5abili(ados #*or a*asJ& e +ue os +ua(ro bi(s de ,Se(Rese(, (amb6m es($o #.ia ,Enable Se(Rese(,&3 colocamos em ,Se(Rese(, os +ua(ro bi(s +ue +ueremos +ue se@am escri(os nos *lanos: 0101b #ou 0K5&9 Pois bem999 *recisamos a*enas carregar os la(c5es e de*ois escre.er na mem)ria do sis(ema9 Tudo bem3 .c di43 mas +ual 6 a grande .an(agem>% ra3 ora999 (emos condi;es de al(erar os +ua(ro *lanos de bi(s ao mesmo (em*o%% E3 mel5or ainda3 es(amos em condi$o de se(ar a(6 oi(o *i2eis ao mesmo (em*o%%%% E2*erimen(e (rocar a lin5a: MO │ mo. a23005 Bi(asJ W 10000000b │ Q
*or:
MO │ mo. a230FF05 Bi(asJ W 11111111b │ Q Voc? .er' oi(o *i2eis magen(a do sis(ema%%
com
uma =nica escri(a na mem)ria
u(ra grande .an(agem 6 o gan5o de .elocidade: Na lis(agem acima os dados +ue .$o ser colocados nos *lanos de bi(s n$o s$o 8ornecidos dire(amen(e *ela CP/3 mas sim *or ,Se(Rese(, e *elos la(c5es9 Assim3 a *laca VXA n$o se in(eressa *elo con(e=do de A! +ue 8oi escri(o na mem)ria do sis(ema e n$o adiciona % (e2(os9
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº GI ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra A(6 agora .imos os regis(radores a*asJ3 Bi(asJ3 ,Enable Se(Rese(, e Se(Rese(9 Vimos (amb6m +ue a*asJ *ermi(e ou n$o mudanas nos +ua(ro *lanos de bi(s ide*enden(emen(e9 Bi(asJ mascara os bi(s n$o dese@'.eis #e esses s$o lidos dos la(c5es +uando escre.emos na mem)ria&9 Ainda *or cima3 .imos +ue 6 *oss-.el a(uali4ar os +ua(ro *lanos de bi(s ao mesmo (em*o com bi(s di8eren(es usando ,Enable Se(Rese(, e Se(Rese(9 sso (udo usando o modo de escri(a 0%
➠ odo de escri(a 1 modo de escri(a 1 lida somen(e com os la(c5es da *laca VXA9 Com esse modo *odemos co*iar o con(e=do dos +ua(ro *lanos de bi(s de uma *osi$o *ara ou(ra com uma =nica ins(ru$o em assembly% Como @' .imos3 os la(c5es dos +ua(ro *lanos s$o carregados sem*re +ue 8a4emos uma lei(ura na mem)ria do sis(ema #em (odos os modos de escri(a%&9 No modo 1 isso (amb6m .ale9 S) +ue nesse modo n$o 6 *oss-.el escre.er nada nos *lanos de bi(s%% Sim*lesmen(e3 +uan(o mandamos escre.er numa de(erminada *osi$o da mem)ria do sis(ema3 os la(c5es 6 +ue a(uali4ar$o essa *osi$o9 No modo 1 os regis(ros Se(Rese(3 ,Enable Se(Rese(, e Bi(asJ n$o 8uncionam *ara nada9 Assim3 de*ois de se(ado o modo 13 *odemos usar: MO │ REP VSB │ Q Para co*iarmos by(es dos +ua(ro *lanos de .-deo de uma *osi$o da (ela *ara ou(ra9 E RAP% S) +ue (em um *e+ueno *roblema: Podemos co*iar B"TES e n$o *i2eis indi.iduais% !embre7se +ue um by(e con(6m oi(o *i2eis #com cada bi( de um *i2el em um *lano de bi(s%&9 Se sua in(en$o 6 co*iar um bloco in(eiro3 *or6m alin5ado *or B"TE3 en($o o modo 1 6 a escol5a mais sensa(a9 Caso con(r'rio3 use ou(ro modo de escri(a #o modo 03 *or e2em*lo%&9 A555999 *odemos conseguir o mesmo e8ei(o do modo de escri(a 1 no modo de escri(a 0% Bas(a 4erarmos (odos os bi(s de Bi(asJ% Pense bem: Se Bi(asJ es(' com*le(amen(e 4erado3 en($o os dados .ir$o a*enas dos la(c5es% +ue nos dei2a com um modo de escri(a obsole(o3 @' +ue *odemos 8a4er o mesmo (rabal5o no modo 0% :&
➠ regis(rador E Para a@us(ar o modo de escri(a *recisamos de um regis(rador9 regis(rador E 6 descri(o abai2o:
[ D K I L G 1 0 MO │>│ │ │ │ │>│ │ │ Q Q │ │ Q │ │ │ Q │ │ Q │ Q Q
odo de escri(a odo de lei(ura ddE.en eslocamen(o
=nico cam*o +ue nos in(eressa no momen(o 6 o ,odo de escri(a,9 Por isso3 *ara modi8icar o modo3 *recisaremos ler o regis(ro E3 se(ar o modo de escri(a3 e de*ois reescre.?7lo999 *ara +ue n$o 8aamos mudanas nos demais bi(s9 s modos de escri(a .'lidos s$o os ci(ados an(eriormen(e #re*are +ue esse cam*o (em G bi(s de (aman5o%&9 regis(rador E 8a4 *ar(e do Bi(asJ3 ,Enable Se(Rese(, e Se(Rese(& K9
circui(o XC #o mesmo de da *laca VXA3 seu -ndice 6
MO │ VXA9NC │ │ acros *ara VXA% │ │ Todos os macros al(eram d2 e a2 │ │ │ │ acro: A@us(a o modo de escri(a │ │ macro Se(
│ acro: ]abili(a os bi(s │ │ macro Bi(asJ bi( │ │ i8di8i wbi(v3wa5v │ │ mo. a53bi( │ │ endi8 │ │ mo. al3 │ │ mo. d23LCE5 │ │ ou( d23a2 │ │ endm │ │ │ │ acro: Al(era ,Enable Se(Rese(, │ │ macro EnableSe(Rese( bi(msJ │ │ i8di8i wbi(msJv3wa5v │ │ mo. a53bi(msJ │ │ endi8 │ │ mo. al31 │ │ mo. d23LCE5 │ │ ou( d23a2 │ │ endm │ │ │ │ acro: A@us(a Se(Rese( │ │ macro Se(Rese( .alue │ │ i8di8i w.aluev3wa5v │ │ mo. a53.alue │ │ endi8 │ │ sub al3al al(era (b os 8lags99 │ │ mo. d23LCE5 │ │ ou( d23a2 │ │ endm │ Q
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº GK ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra modo de escri(a 1 n$o 6 ($o =(il3 como .imos no =l(imo (e2(o999 A *lca VXA *ossui algumas redundancias +ue *odem *arecer desnesses'rias *rimeira .is(a3 como *or e2em*lo o modo de escri(a L9 Nesse modo *odemos des*resar o regis(rador ,Enable Se(Rese(, e usar ,Se(Rese(, *ara a@us(ar os bi(s dos +ua(ro *lanos de .-deo9
➠ odo de escri(a L
modo
de escri(a L999
/ma
MO │ ideal │ │ model small3c │ │ locals │ │ @um*s │ │ *LD │ │ │ │ inclui os macros de8inidos no =l(imo (e2(o% │ │ include ,VXA9NC, │ │ │ │ SCREENSEXENT e+u 0A0005 │ │ │ │ Taman5o de uma lin5a999 #modo DI02I0& │ │ !NES^E e+u 0 │ │ │ │ Coordenadas m'2imas999 │ │ AHHPS e+u DL\ │ │ AH"PS e+u I[\ │ │ │ │ global gr]ori4!ine:*roc │ │ global grVer(!ine:*roc │ │ global se(Xra*5ode:*roc │ │ global se(Te2(ode:*roc │ │ │ │ codeseg │ │ │ │ ESEN]A !N]A ]R^NTA! │ │ *roc gr]ori4!ine │ │ arg le8(:ord3 rig5(:ord3 y:ord3 color:ord │ │ local bi(masJ1:by(e3 bi(masJG:by(e │ │ uses si3 di │ │ │ │ Veri8ica se a coordenada " 6 .'lida999 │ │ mo. a23jyk │ │ or a23a2 │ │ @s zzgr]ori4!ineE2i( │ │ │ │ cm* a23AH"PS │ │ @a zzgr]ori4!ineE2i( │ │ │ │ Veri8ica .alidade das coordenadas ,le8(, e ,rig5(,999 │ │ mo. a23jle8(k │ │ cm* a23jrig5(k │ │ @b zznoSa* │ │ │ │ Troca ,le8(, *or ,rig5(, │ │ se ,rig5(, 8or menor +ue ,le8(,9 │ │ 2c5g a23jle8(k │ │ mo. jrig5(k3a2 │ │ │ │ zznoSa*: │ │ Veri8ica a .alidade das coordenadas ,le8(, e ,rig5(, │ │ cm* a23AHHPS ,le8(, 6 .alido> │ │ @a zzgr]ori4!ineE2i( │ │ │ │ or jrig5(k30 ,rig5(, 6 .alido> │ │ @s zzgr]ori4!ineE2i( │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
Bi(asJ a*asJ
0FF5 Bi(asJ (o(almen(e se(ado% 1111b ]abili(a (odos os +ua(ro *lanos de bi(s9 wjby(e colorkv A@us(a a cor dese@ada999
│ │ │ Se(Rese( │ │ mo. a23SCREENSEXENT │ mo. es3a2 ES W segmen(o de .-deo9 │ │ Calcula os o88se(s das colunas999 │ mo. si3jle8(k │ mo. di3jrig5(k │ s5r si3L si W o88se( da coluna le8( │ s5r di3L di W o88se( da coluna rig5( │ │ Calcula o o88se( da lin5a y │ mo. b23jyk │ mo. a23!NES^E │ mul b2 │ mo. b23a2 BH con(6m o o88se( da lin5a9 │ │ Pr67calcula a mascara da coluna le8( │ mo. c23jle8(k │ mo. c53cl │ and c53111b │ mo. cl3 │ sub cl3c5 │ mo. a530FF5 │ s5l a53cl │ no( a5 │ mo. jbi(masJ1k3a5 │ │ *r67calcula a mascara da coluna rig5( │ mo. c23jrig5(k │ and cl3111b │ inc cl │ mo. a530FF5 │ s5r a53cl │ no( a5 │ mo. jbi(masJGk3a5 │ │ Veri8ica se a*enas um by(e ser' a(uali4ado9 │ cm* si3di │ @4 zzneBy(e │ │ mo. a53jbi(masJ1k │ 2c5g jes:b2Zsik3a5 Escre.e na mem)ria da .ideo999 │ 999 HC]X *rimeiro l? o +ue │ es(' no o*erando des(ino3 │ de*ois e8e(ua a (roca9 │ Com isso economi4amos um V% │ inc si │ cm* si3di │ @e zzdoasJG │ │ zziddlera: │ mo. jby(e es:b2Zsik30885 !in5a c5eia999 │ N$o *recisamos │ carregar os la(c5es │ *+ (odos os bi(s │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ zzdoasJG: │ mo. a53jbi(masJGk │ 2c5g jes:b2Zsik3a5 Escre.e na mem)ria de .-deo │ @m* zz]ori4!ineEnd │ │ zzneBy(e: │ and a53jbi(masJ1k │ 2c5g jes:b2Zsik3a5 │ │ zz]ori4!ineEnd: │ │ @s zzgrVer(!ineE2i( │ │ cm* a23AHHPS 2 v DL\> │ @a zzgrVer(!ineE2i( │ │ Veri8ica se *recisa 8a4er sa* │ mo. a23j(o*k │ cm* a23jbo((omk │ @b zznoSa* │ │ 2c5g a23jbo((omk │ mo. j(o*k3a2 │ │ zznoSa*: │ Veri8ica se as coordenadas ,", es($o den(ro da 8ai2a9 │ cm* a23AH"PS │ @a zzgrVer(!ineE2i( │ │ cm* jbo((omk30 │ @s zzgrVer(!ineE2i( │ │ mo. a23SCREENSEXENT │ mo. es3a2 │ │
si si3di zziddlera
ser$o a(uali4ados%
│ Se(Rese( wjby(e colorkv │ │ │ │ mo. si3j(o*k │ │ │ │ mo. a23!NES^E │ │ mul si │ │ mo. b23a2 BH con(6m o o88se( da lin5a │ │ │ │ mo. di3j2k │ │ mo. c23di │ │ s5r di3L con(6m o o88se( da coluna │ │ │ │ and cl3111b │ │ mo. a5310000000b │ │ s5r a53cl │ │ │ │ zzSe(Pi2el!oo*: │ │ mo. cl3a5 │ │ 2c5g jes:b2Zdik3cl │ │ add b23!NES^E │ │ inc si │ │ cm* si3jbo((omk │ │ @be zzSe(Pi2el!oo* │ │ │ │
J999 E se a lin5a ocu*ar G by(es>% Por e2em*lo3 de #G30& a(6 #1130&999 *on(o #G30& es('3 com cer(e4a3 no *rimeiro by(e999 mas o *on(o #1130& n$o #@' +ue um by(e su*or(a a*enas *i2eis%&9 En($o calculados os dois bi(masJs: MO │ Bi(asJ1 W 00111111b Bi(asJ do inicio da lin5a │ │ Bi(asJG W 11110000b Bi(asJ do 8im da lin5a │ Q ai escre.emos o *rimeiro by(e com o bi(masJ1 e o segundo com o bi(masJG9 Se a lin5a ocu*ar mais de G by(es o *rocesso 6 o mesmo3 s) +ue os by(es in(ermedi'rios (er$o bi(masJs (o(almen(e se(ados #n$o necessi(ando3 nes(e caso3 carregar os la(c5es%&9 Na mesma lis(agem (emos a ro(ina de (raagem de lin5as .er(icais999 d? uma ol5ada nela9 bem mais sim*les +ue gr]ori4!ine% No *r)2imo (e2(o: modo de GKD cores% #8inalmen(e3 n6>%&
escri(a
G%
E de*ois3 os modos de
┏━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ RBT │ Curso de Assembly │ Aula Nº GD ┃ ┗━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ Por: Frederico Pissarra Vis(os os (r?s *rimeiros modos de escri(a da *laca VXA3 nos res(a a*enas o modo G9 Esse modo 6 mui(o =(il *ara escri(a de bi(ma*s nos modos de .-deo de 1D cores999 Ele (rabal5a basicamen(e como o regis(ro Se(Rese(3 sem +ue (en5amos +ue manusear esse regis(ro e2*lici(amen(e9
➠ modo de escri(a G /ma .e4 se(ado3 o modo de escri(a G 5abili(a (odos os +ua(ro bi(s de ,Enable Se(Rese(,3 da mesma 8orma +ue o modo de escri(a L9 No en(an(o3 di8eren(e do modo de escri(a L3 o regis(ro Se(Rese( n$o *recisa ser a@us(ado com a ,cor, dese@ada9 Nes(e modo o regis(ro Se(Rese( 6 se(ado com os +ua(ro bi(s menos signi8ica(i.os en.iados *ela CP/ mem)ria do sis(ema9 Precisaremos mascarar os bi(s n$o dese@ados em Bi(asJ3 bem como a@us(ar os *lanos de bi(s dese@ados em a*asJ9 Re*are na 8ora des(e modo de .-deo999 *oderemos a(uali4ar *i2els com a ,cor, +ue +uisermos sem usarmos Se(Rese( dire(amen(e3 e sem (ermos +ue se(ar os bi(s de ,Enable Se(Rese(,9 as3 (eremos +ue a@us(ar Bi(asJ *ara n$o se(armos (odos os oi(o *i2els no by(e +ue es(amos escre.endo dos *lanos de bi(s999 Eis um e2em*lo do modo de escri(a G:
MO │ ideal │ │ model (iny │ │ locals │ │ @um*s │ │ │ │ include ,.ga9inc, │ │ │ │ !NE!ENXT] e+u 0 │ │ │ │ codeseg │ │ org 1005 │ │ s(ar(: │ │ mo. a231G5 A@us(a modo de .-deo DI02I021D │ │ in( 105 │ │ │ │ % │ │ @b zz1 n$o999 en($o *ermanece no loo*9 │ │ mo. cl31000b a@us(a * cor inicial9 │ │ add di3!NE!ENXT] *r)2ima lin5a │ │ inc bl incremen(a con(ador de lin5as │ │ cm* bl3 c5egou na lin5a > │ │ @b zz1 n$o999 con(inua no loo*9 │ │ │ │ sub a53a5 es*era (ecla3 sen$o n$o (em graa% │ │ in( 1D5 │ │ │ │ mo. a23L .ol(a ao modo (e2(o999 │ │ in( 105 │ │ │ │ in( G05 8im do *rograma9 │ │ end s(ar( │ Q Esse modo *arece mais 8'cil +ue os demais3 n$o>% A*aren(emen(e 6999 mas (en5a em men(e +ue os ou(ros modos de escri(a (amb6m (?m suas .an(agens9
➠ E os modos de lei(ura>%