Sie sind auf Seite 1von 6

20/12/12

Somando dois nmeros e escrevendo-os na tela Campo de ArrozCampo de Arroz

Assuntos diversos: farmcia, informtica, msica Campo de Arroz

Somando dois nmeros e escrevendo-os na tela


Augusto Maeda

H algum tempo, havia encontrado um cdigo de uma calculadora assembly em 48 bits. No consigo encontrar o cdigo fonte mais, mas tenho um artigo no qual analisei uma das operaes da calculadora. Nesta pgina ser discutido como o autor desta calculadora fez para somar dois nmeros de 48 bits e escrev-los na tela. Os cdigos aqui escrito foram adaptados sintaxe do fasm. Primeiro, vamos ver como efetuar a soma de dois nmeros em assembly:

Add
Para efetuar uma adio, usamos o mnemnico add. A forma geral da adio :
adoead1oead2 d prno,prno

Esta instruo adicionar o operando2 ao operando1, guardando o resultado no operando1 Regras: 1)O operando1 pode ser um registrador ou um local da memria 2)O operando2 pode ser um registrador, um local da memria ou um valor. 3)O operando1 e o operando2 no podem ambos locais da memria. Exemplo: Queremos efeuar a soma 10+20 e representar a soma usando 32 bits. Uma das possibilidades seria colocar o nmero 10 no registrador eax. Depois somamos ao registrador eax o nmero 20. O resultado estar no registrador eax.
mvex1 o a,0 adex2 d a,0

Mas a poderia surgir uma dvida. E se o resultado da soma for maior que a capacidade de armazenamento do operando1? Um exemplo: digamos que o registrador al contenha o nmero 57 (39h). Vamos somar a este registrador o nmero 250 (0FAh). Obviamente o resultado da soma o nmero 307 (133h). Mas sabemos que o registrador al s consegue armazenar at o nmero 255 (0FFh). O que ocorrer ento, ao efetuar esta soma?.
mva,0 o l5 ada,5 d l20

Analisando a soma usando nmeros hexadecimais, temos o seguinte: Carry Nmero 57 3 9 Nmero 250 F A Devemos somar o nmero casa a casa. Primeiro somamos o nmero 9 ao nmero A. 9 + A = 13. Colocamos o nmero 3 como resultado e subimos uma unidade para somar com a prxima casa. Carry 1

Nmero 57 3 9 Nmero 250 F A campodearroz.com/blog/programacao/somando-dois-numeros-e-escrevendo-os-na-tela


1/6

20/12/12

Somando dois nmeros e escrevendo-os na tela Campo de ArrozCampo de Arroz

Nmero 250 F A 3 Repetimos o processo para a segunda casa. Somamos 1 + 3 + F = 13. O resultado ser 3 e subimos o nmero 1. Carry Nmero 57 Nmero 250 11 3 9 FA 3 3 Ao efetuar esta soma em assembly, o registrador al ficar com o valor 33h (51). Como ocorreu um estouro na soma, isto ser indicado pelo flag de carry (CF), que ser setado (assumir o valor 1). Caso no ocorresse este estouro, o CF assumiria valor zero. Note que o valor 51 corresponde (57+250)-256. Bem, somar dois nmeros de 32bits, de 16 bits ou de 8 bits uma tarefa fcil. Mas se quisssemos somar dois nmeros de 48 bits, como deveramos proceder? No existem registradores de 48 bits Vamos ento analisar o cdigo da calculadora. Os nmeros de 48 bits foram fragmentados em trs partes de 16 bits, para que pudessem caber em registradores. Um dos nmeros armazenado no registrador ax, bx, cx. O outro armazenado em dx, si, di. Bits 47-32 31-16 15-0 Nmero 1 ax bx cx Nmero 2 dx si di O processo de soma est descrito no cdigo abaixo:
ad d mv o ac d mv o ac d mv o c ,d x i [ecio ,c trer] x b ,s x i [eud],b sgno x a ,d x x [rmio ,a pier] x ;oaod mnrodmc cmd sm e eo re x o i ;xe trer (plvad mnrodm) c m ecio aar e eo re ;oaplvad mdaodm sm aar e ei re ;xe trer (plvad mnrodm) c m ecio aar e eo re

;xe trer (plvad mnrodm) c m ecio aar e eo re

Epa, surgiu a um mnemnico que eu no havia explicado, o adc.

Adc
O mnemnico adc possui o mesmo comportamento do mnmonico add, com um detalhe a mais. Se o CF (carry flag) estiver setado, o valor um ser adicionado a soma Assim, ao usar a intruo:
acoead1oead2 d prno,prno

O operando1 apresentar o valor operando1+operando2, caso CF=0 ou operando1+operando2+1, caso CF=1 (esteja setado.) Vamos analisar o cdigo ento: 1)Ele somou os dezesseis bits de menor ordem (cx+di) usando add cx,di 2)Ele guardou a soma na varivel terceiro 3)Ele somou os dezesseis bits do meio usando adc bx,si. Ele usou adc porque caso tenha ocorrido um estouro na soma entre cx e di, o CF ser setado e, assim, devemos adicionar um soma de bx com si. 4)Ele guardou a soma na varivel segundo 5)Ele somou os dezesseis bits de maior ordem usando adc ax,dx. Ele usou adc porque caso tenha ocorrido um estouro na soma entre bx e si, o CF ser setado e, assim, devemos adicionar um soma de ax com dx. 6)Ele guardou a soma na varivel terceiro. O resultado, ento, est em locais da memria. Bits 47-32 31-16 15-0
2/6

campodearroz.com/blog/programacao/somando-dois-numeros-e-escrevendo-os-na-tela

20/12/12

Somando dois nmeros e escrevendo-os na tela Campo de ArrozCampo de Arroz

Soma primeiro segundo terceiro

Imprindo na tela a soma


Para imprimir a soma, basta chamar por uma funo que escreva na tela. Mas antes disto, devemos converter o valor da soma (um nmero) em um conjunto de caracteres (uma string). Para imprimir na tela, a estratgia a seguinte: 1)Dividir o nmero por 10. 2)Guarde o resto. Cada resto corresponde a uma casa do nmero. 3)Somar cada resto o nmero 48 (30h), pois o nmero 0 representado pelo cdigo ascii 48 decimal, o nmero 1 representado por 49 decimal e assim sucessivamente. 4)Divida o quociente por 10 5)Repita os passos 2 a 4, at quando o quociente for zero. 6)Quando o quociente for zero, isto indica que voc chegou na ltima casa. Assim, pare de dividir o nmero. O ltimo resto ser a primeira casa do nmero (a de maior valor relativo). No nosso caso, o nmero est fragmentado em trs pores de 16 bits Isto vai dificultar a escrita na tela. O que o autor da calculadora fez foi o seguinte:
xr o mv o mv o d ,d x x b ,0h x A d ,bfe_oa+5 i ufrsm 0 ;ip d pr dvso lma x aa ii ;o 0hpr dvsoe b pe A aa ii m x ;av oedr d utm bt d bfe e dsiainidx sla neeo o lio ye e ufr m etnto ne

cnet: ovre mv o dv i mv o mv o dv i mv o mv o dv i mv o ad d mv o dc e xr o cp m je n cp m je n cp m je n a ,[rmio x pier] b x [rmio ,a pier] x a ,[eud] x sgno b x [eud],a sgno x a ,[ecio x trer] b x [ecio ,a trer] x d ,00 l 3h [i ,d d] l d i d ,d x x wr [rmio ,0 od pier] cnet ovre wr [eud],0 od sgno cnet ovre wr [ecio ,0 od trer] cnet ovre ;ooaavrpier e a pr dvso clc a rmio m x aa ii ;iied:xprb dvd xa o x ;rmiorslaod a e pier pier eutd e x m rmio

;eud rslaod a e sgno sgno eutd e x m eud ;a trer e a pr dvso vr ecio m x aa ii ;iied:xprb dvd xa o x ;eciorslaod a e trer trer eutd e x m ecio ;nrmna00 a rsod utm dvsopr fcrACI iceet 3h o et a lia ii aa ia SI ; ovlrd d n cned dseedr pe ao e h o otuo es neeo ;ermnae u d dceet m m i

;efriulazr pl pr pit s o ga eo ua aa rna

Ele usou a instruo div bx, onde bx vale 10 (0Ah).

Div
A forma geral da diviso :
dvoead i prno

O operando pode ser um local da memria ou um registrador. Pode assumir o tamanho de 8, 16 ou 32 bits. Se o operando for de 8 bits, o registrador ax ser dividido pelo operando. Aps a diviso, o quociente estar em al e o resto em ah. Se o operando for de 16 bits (como o caso = bx), o nmero cujos 16 bits de maior ordem esto em dx e 16 bits de menor ordem esto em ax, sero divididos pelo operando. O quociente ir para ax e o resto para dx Resumindo: div bx Far a diviso dx:ax por bx Aps a diviso: Quociente=ax
campodearroz.com/blog/programacao/somando-dois-numeros-e-escrevendo-os-na-tela 3/6

20/12/12

Somando dois nmeros e escrevendo-os na tela Campo de ArrozCampo de Arroz

Resto=dx Se o operando for de 32 bits o nmero cujos 32 bits de maior ordem esto em edx e 32 bits de menor ordem esto em eax, sero divididos pelo operando. O quociente ir para eax e o resto para edx Resumindo: div ebx Far a diviso edx:eax por ebx Aps a diviso: Quociente=eax Resto=edx Continuando a explicao do cdigo, para converter o nmero de 48 bits em cdigo ascii, ele fez o seguinte: 1)Dividiu os 16 bits de maior ordem por 10. (0000:primeiro / 0Ah) O resto foi para dx. Guardou o quociente. 2)Pegou o nmero formado pelo resto da diviso 1 e pelos 16 bits do meio (dx:segundo / 0Ah) e dividiu por 10. O resto foi para dx. Guardou o quociente. 3)Dividiu o nmero formado pelo resto da diviso 2 e pelos 16 bits de menor ordem (dx:terceiro / 0Ah) e dividiu por 10. O resto foi para dx.Guardou o quociente. 4)Usou o resto e somou com o nmero 30h (48 decimal). Guardou o resto, pois uma casa do nmero. 5)Repete-se o processo at que todos os quocientes forem zero. Os caracteres esto armazenados na regio da memria apontada pelo label buffer_soma. O registrador di aponta para onde o caractere deve ser armazenado. Cada vez que um caractere armazenado na memria, di sofre o decrscimo de uma unidade (usando a instruo dec di), permitindo o armazenamento de mais um caractere. Para imprimir o nmero, basta chamar agora por uma funo do sistema operacional para o qual o cdigo est sendo feito (SysCall).
Compartilhe isso: Compartilhar

Tags: 48 bits, Assembly, programao, soma


This entry was posted on quinta-feira, dezembro 20th, 2012 at 10:42 pm and is filed under Assembly, Informtica, Programao. You can follow any comments to this entry through the RSS 2.0 feed. You can leave a comment, or trackback. Edit this entry.

Deixe uma resposta


Conectado como Augusto Maeda. Desconectar?

Comentrio Voc pode usar estas tags e atributos de HTML: < h e = " t t e " > < b r t t e " > < c o y t t e " > < > a rf" il=" ab il=" arnm il=" b
<lcqoect=" <ie <oe <e dttm=" <m <>< ct=" <tie <tog bokut ie"> ct> cd> dl aeie"> e> i q ie"> srk> srn> Publicar comentrio

Notifique-me dos comentrios seguintes por email. Notifique-me de novos posts por email.

Tpicos recentes
campodearroz.com/blog/programacao/somando-dois-numeros-e-escrevendo-os-na-tela 4/6

20/12/12

Somando dois nmeros e escrevendo-os na tela Campo de ArrozCampo de Arroz

Somando dois nmeros e escrevendo-os na tela Produtos estreis no Documento da OMS de garantia de qualidade Alguns termos em Assembly Estrutura dos Glicosdeos Cardacos Sem agncias reguladoras por um Estado mais liberal

Categorias
Administrao Pblica Assembly Bioqumica Biossegurana Economia Equaes diferenciais Farmacocintica Farmacodinmica Farmacognosia Farmacologia Fsico-Farmcia Garantia da Qualidade Gerenciamento da Qualidade Informtica Japons Macroeconomia Microeconomia Msica Programao Qumica dos Produtos Naturais Qumica Farmacutica Rock alternativo Tecnologia Farmacutica Tecnologias Uncategorized Vigilncia Sanitria

Tags
48 bits Add new tag Alternative alternativo android Assembly carboidratos depresso;bdnf dopamina eixo hipotlamo hipfise adrenal Glicosdeos Cardacos Informtica lactona microeconomia monitor monoaminas neurotrfica norepinefrina ncleo esteride programao rock RXR PPAR receptores nucleares serotonina soma splashtop windows XOOM informtica

Arquivos
dezembro 2012 novembro 2012 abril 2012 maro 2012 fevereiro 2012 dezembro 2011 abril 2011 dezembro 2009 novembro 2009 julho 2009 janeiro 2009 dezembro 2008 julho 2008 maro 2008

Meta
campodearroz.com/blog/programacao/somando-dois-numeros-e-escrevendo-os-na-tela 5/6

20/12/12

Somando dois nmeros e escrevendo-os na tela Campo de ArrozCampo de Arroz

Administrao Logout Posts RSS RSS dos comentrios WordPress.org Copyright 2012 Campo de Arroz Powered by WordPress. Designed by Blog Design. Follow

Follow Campo de Arroz


Get every new post delivered to your Inbox Join other followers:
Email Address Sign me up!

campodearroz.com/blog/programacao/somando-dois-numeros-e-escrevendo-os-na-tela

6/6

Das könnte Ihnen auch gefallen