|
Ассемблер в примерах - Отображение содержимого регистра eax
- Вопрос:
-
В регистре eax имею число 1178 в 16 - 0х049A.
Как мне его посмотреть в окне Windows?
mov [result],eax
invoke MessageBox,0,result,caption,MB_ICONQUESTION+MB_YESNO
выдает 2 символа с кодами 0х04 и 0х9A
Мне нужно, чтобы в окне было написано "1178" т.е. символы 0х31,0х31,0х37,0х38
Как это сделать?
- Ответ:
-
необходимо преобразовать двоичное число регистра в его текстовое представление.
Смотрите в приложении подпрограмму для fasm
title DB 'EAX =',0
EAX_value_str DB 11 DUP (?)
...
lea edx,[EAX_value_str]
stdcall bin32_to_decim_ascii, eax,edx
invoke MessageBoxA, 0,EAX_value_str,title,MB_OK
...
;--------------------------------------------------------------------------
;подпрограмма перевода двоичного числа в десятичное текстовое представление
;uint - двоичное число, p_result_buf - указатель буфера строки результата
;--------------------------------------------------------------------------
proc bin32_to_decim_ascii, uint:DWORD,p_result_buf:DWORD
push ebx ecx edx edi
mov ebx,[p_result_buf]
add ebx,0Ah
mov BYTE [ebx],0
dec ebx
mov edi,0Ah ;делитель
;счетчик
mov eax,[uint]
cmp eax,10
jb .cnt_1
cmp eax,100
jb .cnt_2
cmp eax,1000
jb .cnt_3
cmp eax,10000
jb .cnt_4
cmp eax,100000
jb .cnt_5
cmp eax,1000000
jb .cnt_6
cmp eax,10000000
jb .cnt_7
cmp eax,100000000
jb .cnt_8
cmp eax,1000000000
jb .cnt_9
mov ecx,0Ah
jmp .div10_loop
.cnt_1:
mov ecx,01h
jmp .div10_loop
.cnt_2:
mov ecx,02h
jmp .div10_loop
.cnt_3:
mov ecx,03h
jmp .div10_loop
.cnt_4:
mov ecx,04h
jmp .div10_loop
.cnt_5:
mov ecx,05h
jmp .div10_loop
.cnt_6:
mov ecx,06h
jmp .div10_loop
.cnt_7:
mov ecx,07h
jmp .div10_loop
.cnt_8:
mov ecx,08h
jmp .div10_loop
.cnt_9:
mov ecx,09h
.div10_loop:
test ecx,ecx
jz .exit
xor edx,edx
div edi ;EAX=частное, EDX=остаток
or dl,110000b
mov [ebx],dl
dec ebx
dec ecx
jmp .div10_loop
.exit:
mov eax,ebx
inc eax
pop edi edx ecx ebx
ret
endp
| |