· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Вывод значения регистра в окне

Посл.отвђт Сообщенiе


Дата: Янв 14, 2004 09:18:33

Подскажите пожалуйста как в MASM'e вывести значение регистра либо локальной переменной в окне.
Заранее спасибо.


Дата: Янв 14, 2004 09:36:51

Поиск по форуму HEX2ASCII


Дата: Янв 14, 2004 10:57:31 · Поправил: Gromozeka

Нашел.Но там же ошибка, а как ее исправить я не знаю.


Дата: Янв 14, 2004 12:39:27

Gromozeka

Ну ты там и спроси, продолжи топик, я не помню что там...


Дата: Янв 14, 2004 13:47:55 · Поправил: Asterix

Самый простой вариант использовать wsprintf
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.DATA

szBuff  db 10 dup (0)
format db "%08lX",0

.CODE

start:

mov eax, 012ABCDEFh ; !!! переводим сразу DWORD !!!

push eax
push OFFSET format
push OFFSET szBuff
call wsprintf
add esp, 00Ch

xor ecx, ecx
invoke MessageBox, ecx, OFFSET szBuff, ecx, ecx
invoke ExitProcess, ecx

end start


Дата: Янв 14, 2004 17:57:52

Вот так тоже можно сконвертить:
ESI - буфер, EAX - HEX число

Hex2Str		proc
			mov		ecx, 8 ; 8 hex digits
			push	eax
@@:			mov		[ESP], eax
			and		eax, 0Fh
			cmp		al, 10
			sbb		al, 69h
			das
			mov		[esi+ecx], al
			mov		eax,[ESP]
			shr		eax, 4 
			dec		ecx
			jnz		@b
			pop		eax		; restore stack
			ret
Hex2Str 	endp


Тут можно размер немного сократить размер, если внести push/pop в тело цикла. Тогда mov [ESP] убрать


Дата: Янв 14, 2004 18:24:14

Gromozeka
Нету там никакой ошибки.

Ещё можно посмотреть исходник PrintHex, которая в отладочной библиотеке by vkim.


Дата: Янв 15, 2004 15:54:21

Если нужно выводить в десятичном формате, могу предложить
свой код:
;*******************************************************
; ПРОЦЕДУРА ПРЕОБРАЗОВАНИЯ ЧИСЛОВОГО ЗНАЧЕНИЯ В СТРОКОВОЕ
; (DEC-ФОРМАТ)
;*******************************************************
_IntToStrA proc Value:dword,	;исходное значение
		pStr:dword,	;адрес буфера вывода
		ZeroNum:dword	;кол-во нулей для
				;незаполненных разрядов
	pushad
	mov	eax,Value
	mov	esi,pStr

	mov	ebx,10
	xor	ecx,ecx

       ;------ загоняем в стек, начиная с младших разрядов
  .while eax
	xor	edx,edx
	div	ebx
	or	dl,30h
	push	edx
	inc	ecx
  .endw
	;------	заполняем нулевыми символами
  .while ecx<ZeroNum
	mov	eax,30h
	mov	[esi],al
	inc	esi
	dec	ZeroNum
  .endw

       ;------ читаем из стека в буфер
  .while ecx
	pop	eax
	mov	[esi],al
	inc	esi
	dec	ecx
  .endw

	;------	ставим нулевой символ в конце строки
	xor	eax,eax
	mov	[esi],al

	popad
	ret
_IntToStrA	endp


Дата: Янв 16, 2004 01:40:36 · Поправил: prog

Bin->Десятичный ASCII

iBin- число которое надо преобразовать в ASCII
pStr- куда положить zero-terminated ASCII

возвращает кол-во цифр в ASCII(может пригодиться)
Bin2Str proc iBin:dword,pStr:dword

	mov eax,iBin
	mov edi,pStr

	xor ecx,ecx
	mov ebx,10d
@@:	xor edx,edx		; Clear	top
	div ebx			; Divide to get	last digit as remainder
	add dl,"0"		; Convert to ASCII
	push edx		; Save on stack
	or eax,eax		; Quotient 0?
	loopnz @B		; No? Get another
	
	neg ecx			; Negate and save count
	mov edx,ecx
@@:	pop eax			; Get character
	stosb			; Store	it
	loop @B

	xor eax,eax
	stosb

	mov eax,edx		; Return digit count
	
	ret
	
Bin2Str endp

это было написано неизвестным автором в 1987(!) году, правда, в 16-ти битном виде.


Дата: Янв 16, 2004 02:45:27 · Поправил: merlin

Две веши:
1) В-87, не было 32 битных регов (точнее были но только
начали появлятса, и поэтому ими ещё никто не пользовался).
2) В-87 если бы кто то использовал div чтобы делить на
константу (получение остатка не являетса оправданием)
его бы сразу осудили как полным дураком который не умеет
програмировать на асме.

Очен похожый алгоритм встретился в книге Тома Свана по
асму. Только там он написан по умнее чем здесь (база
ужэ не константа).


Дата: Янв 16, 2004 11:40:05 · Поправил: prog

merlin
я и говорю- оригинал был 16 битный. дойду до дома, покажу исходник.
в 90 у нас на заводе появился первый "Shnaider" IBM PC AT
так сказать какбы mini-tower
крутая была вещь. Особенно его цветной монитор 16-ти цветный :))
он радовал глаз, уставший от черно-рыжих мониторов XT.
На нем можно было раскрашивать ячейки SuperCalc-а разными цветами и радоваться этому :))
Но в основном мы его использовали для игр. :)
Как там ее... SpaceQuest


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.071