• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

so_simple

Assembly NASM converter hex para dec

3 mensagens neste tópico

Alguem sabe como converter em NASM assembly um valor numa var dword de hexadecimal para decimal?

por ex tenho o valor 00 00 01 FEh numa dword e quero converter este valor para decimal que é 510...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Diz-me o que queres fazer ao certo que pode ser que te consiga ajudar. No entanto, teres em hex ou dec são formas diferentes de representares o mesmo valor.

Caso estejas a programar pra win32, sempre podes fazer um call wsprintf ou algo semelhante. Se é pra *nix, tal como em win32, usa uma função semelhante que o OS te ofereça. Caso contrário, fazes uma função à la mano.  :P

Força

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epa, nao percebo a tua duvida, pk tu ja tens esse valor em decimal. A forma como o representaste aqui no forum é k foi em hexadecimal.

Tu tens esse valor armazenado na memoria, como um número absoluto. que pode ser representado por 510 em decima, ou 1FE em hexadecimal ou 776 em octal...ou seja, tu tens sempre um valor decimal.

Se tu o queres representar, por exemplo, num array de bytes, em codigo ascii, aí sim, precisas de definir uma base para o representares.

assumindo que é isso que queres, entao fazes assim:

bits 32

;funcao   int funcao(dword num,char *buf, int bufLen)  ;devolve(no eax) o numero de caracteres convertidos, ou o tamanho (em bytes) do buffer necessario para os armazenar

arg1 equ 0x08
arg2 equ 0x0C
arg3 equ 0x10


funcao:
push ebp
mov ebp,esp

push ebx
push ecx
push edx
push esi

mov eax, [ebp+arg1]  ;vai buscar o num
mov edi, [ebp+arg2]  ;vai buscar o buf
mov ecx, [ebp+arg3]

xor edx,edx ;armazena o numero de digitos

converte:	
call mod10
inc edx
test edi,edi ;se o edi for nulo, apenas conta o nº d digitos necessarios para armazenar o numero
jz soConta
		add bl, '0' ;converte o numero, num digito ascii
		mov [edi],bl
		inc edi

		cmp edx,ecx
		je fim_converte ;se ja ocupou todo o buffer..
soConta:
test eax,eax
jz fim_converte
jmp converte
fim_converte:  ;por esta altura, temos o numero incial colocado no buffer, em Big Endian (digitos mais significativos em posições superiores d memoria)

mov eax, edx ;devolve o numero de caracteres utilizados (ou necessários)

pop esi
pop edx
pop ecx
pop ebx
mov esp,ebp
pop ebp

ret 0xC

  
  

mod10:  ;pega no eax, faz-lhe o modulo 10, devolve o resto no bl, e o resultado da divisao no eax
xor ebx,ebx
mod10_loop:
	cmp eax,10
	jb fim_mod10
		;ainda é maior que 10, subtrai
		sub eax,10
		inc ebx
jmp near mod10_loop
fim_mod10:
;troca os registos
push eax
mov eax, ebx
pop ebx
retn

este codigo ta no formato do nasm (para mim, e para muitos, o melhor assembler da actualidade), que pelos vistos tb utilizase

epa, cometi o erro d acabar d escrever este codigo, e d nao o testar!...mas a ter algum bug, dev d ser coisa pouca, mas espero k j ajude.

Este codigo funciona assim:

chamas a funcao em c-decl

push [tamanho do buffer]

push [ptr do buffer]

push [numero a representar em dec]

call funcao

o valor devolvido será o numero de caracteres colocados no buffer

esta funcao tem a funcionalidade funcional de, se o pointer do buffer for nulo, ela nao tenta armazenar nenhum valor, e limita-se a contar o numero d caracteres necessarios, e devolve esse valor no final

assim, podes sempre saber qual o tamanho que deves alocar para o buffer.

um abraço

[ ]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora