Чебуратор
Мыслитель
(8449)
5 лет назад
.file "hextodec.s"
.intel_syntax noprefix
.data
hex_string: .asciz "0FEDEh"
.text
.global start
start:
push offset hex_string
call Hex_To_Dec
ret
Hex_To_Dec:
xor edx,edx
xor ecx,ecx #;Счетчик сдвигов
xor eax,eax #;Результат для хранения десятичного числа
mov ebx,1 #;Стартуем с 1 байта - пропускаем 0
mov esi,[esp + 4]#;Вносим строку в базовый регистр
Scan_Loop:
mov dl,byte ptr [esi + ebx * 1]#;Получаем очередной байт
cmp dl,104 #;Если символ h выходим из цикла
jz Set_Eax_Loop
test dl,64 #;Если это символы буквы значит число больше 9
jz Less_10
sub dl,7 #;Вычитаем 7
Less_10:
sub dl,48 #;Вычитаем 48 для получения числа в диапазоне 0-15
push edx #;Сохраняем результат в стек
inc ebx #;Двигаемся дальше по строке
jmp Scan_Loop
Set_Eax_Loop:
dec ebx #;Уменьшаем на единицу счетчик символов, если ноль то выходим
jz End_Alg
pop edx #;Извлекаем из стека
shl edx,cl #;Сдвигаем биты влево
or eax,edx #;Устанавливаем результат в десятичное представление
add ecx,4
jmp Set_Eax_Loop
End_Alg:
ret 0x4