Консультация № 168376
27.05.2009, 11:36
0.00 руб.
0 7 2
Доброго времени суток!
Вопрос таков.
В регистре 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
Как это сделать?

Обсуждение

Неизвестный
27.05.2009, 11:45
общий
переведите его в Z-строку, вопрос обсуждался много раз уже.
давно
Посетитель
7438
7205
27.05.2009, 11:55
общий
Например, так:
Код:
	.data
caption db 'Value',0
format db '%d',0
.data?
buffer db 256 dup(?)

.code
mov eax, 1178
invoke wsprintf,addr buffer,addr format,eax
invoke MessageBox,0,addr buffer,addr caption,MB_ICONQUESTION+MB_YESNO
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
27.05.2009, 12:03
общий
Airyashov:
как перевести в Z-строку?
Неизвестный
27.05.2009, 12:05
общий
Лысков Игорь Витальевич:
как это будет на чистом ассемблере без Си-шных вставок?
Нет в Ассемблере и в Windows функции wsprintf
Неизвестный
27.05.2009, 12:42
общий
это ответ
Здравствуйте, Игорь К.!

необходимо преобразовать двоичное число регистра в его текстовое представление.
Смотрите в приложении подпрограмму для 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
5
Спасибо! Как раз на fasm и нужно было, но уже ответ Лыскова Игоря Витальевича приспособил.
давно
Посетитель
7438
7205
27.05.2009, 12:44
общий
Так и будет
wsprintf - это функция системная, "лежит" в user32.dll, ее вполне можно вызывать из программы на Ассемблере.
Или переведите в строку "ручками" делением на 10, что тоже проблем не вызывает (или вызывает?).
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
27.05.2009, 13:08
общий
это ответ
Здравствуйте, Игорь К.
Я бы рекомендовал перевести в строку так, как в приложении

Приложение:
.386 ;работаем с 32-битными регистрами, и, вообще, создаем программу под Windows
.model flat,stdcall ;необходимая модел памяти под Windows
option casemap:none ;чтобы различать большие и малые буковки

;подключим необходимые файлы
include /masm32/include/windows.inc
include /masm32/include/user32.inc
include /masm32/include/kernel32.inc
includelib /masm32/lib/user32.lib
includelib /masm32/lib/kernel32.lib

itoa PROTO :DWORD,:DWORD ;прототип нашей функции
.data ;сегмент инициированных данных
caption db 'Value',0
.data?
buffer db 256 dup(?)

.code ;сегмент кода
start: ;точка входа

.code
mov eax, 1178
invoke itoa,addr buffer,eax ;преобразуем число в строку
invoke MessageBox,0,addr buffer,addr caption,MB_ICONQUESTION+MB_YESNO
invoke ExitProcess,eax ;выход из программы с кодом в EAX

itoa proc uses edi ebx pStr:DWORD,iValue:DWORD
mov edi, pStr
xor ecx, ecx ; счетчик цифр
mov ebx, 10 ; будем делить на 10
div_loop: ; цикл получения десятичных разрядов
xor edx, edx ; подготовимся для очередного деления
div ebx ; в edx остаток - очередной десятичный разряд
push edx ; сохраним в стеке (от младшего к старшему)
inc ecx ; посчитаем
test eax, eax ; есть еще десятичные разряды?
jnz div_loop ; продолжим

pr_loop: ; цикл вывода десятичных цифр-символов
pop eax ; востановим очередной разряд (от старшего к младшему)
add al, '0' ; символ цифры
stosb ; сохраним цифру
loop pr_loop ; по всем цифрам
mov byte ptr[edi],0 ;закроем строку нулем
ret
itoa endp
end start ;задаем точку входа
5
Отлично, все получилось, спасибо<br>
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа