Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2011, 15:56   #1
_Igor_
 
Аватар для _Igor_
 
Регистрация: 11.02.2011
Сообщений: 4
По умолчанию Длинное целое из памяти -> .txt (FASM)

Итак, почти окончил написание своей проги, вычисляющей числа последовательности Фибоначчи. Считает всё правильно, проверял дебаггером.
Подскажите, как число в 512 байт из памяти (юзаю "длинную арифметику")
записать в текстовик в десятичном виде.
Заранее спасибо.
_Igor_ вне форума Ответить с цитированием
Старый 11.02.2011, 17:18   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Предложу свое видение:
Код:
start:
 mov eax,[i]
 mov ebx,10
 mov esi,s
 mov ecx,1
do:
 inc ecx
 xor edx,edx
 div ebx
 add dl,'0'
 mov byte [esi],dl
 inc esi
 cmp eax,0
 jnz do
 mov edi,s2
do2:
 mov al,[esi]
 mov [edi],al
 dec esi
 inc edi
 loop do2

ret


 section '.data' data readable writeable
 i dd 25635
 s dd 10 dup(0)
 s2 dd 10 dup(0)
а потом S2 пиши в файл
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.02.2011, 18:14   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Предложу свое видение

Это ж чистый паскаль ))

Я сам в масмах\фасмах не силён, но вот так примерно должно работать. longbuf -- это наше длинное число на 512 байт, outbuf -- это выходной буфер с шестнадцетиричными цифрами. Оно, правда, длинное число наверное задом наперед преобразует, ну это мелочи )

Код:
          xlatt db '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
          longbuf db 0 dup(512)
          outbuf db 0 dup(1024)

          lea  esi, longbuf
          lea  edi, outbuf
          lea  ebx, xlatt
          //
          mov  ecx, 512
    loopme:
          lodsb
          mov  edx, eax

          shr  eax, 4
          and  eax, 0Fh
          xlatb
          stosb

          mov  eax, edx
          and  eax, 0Fh
          xlatb
          stosb

          loop loopme
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 11.02.2011, 19:10   #4
_Igor_
 
Аватар для _Igor_
 
Регистрация: 11.02.2011
Сообщений: 4
По умолчанию

дык, я сам в асме не силен
я пробовал оба варианта и оба дают в текстовике не то.
Stilet: в тхт вот что
Код:
 0                                      4201572
veniside: нули, только нули
Может есть какая-то библиотечная функция для этого?
upd:
Также поясню по коду:
переменная, хранящая число, объявлена так: f2 dd 128 dup(0)
заполненная переменная выглядит так(к примеру): 0000...0037 т.е. десятое число.

Последний раз редактировалось _Igor_; 11.02.2011 в 19:19.
_Igor_ вне форума Ответить с цитированием
Старый 11.02.2011, 21:15   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
я пробовал оба варианта и оба дают в текстовике не то.
А вопрос в том как ты записываешь. Сформированная строка должна нулем оканчиваться. Да и потом, я привел пример для 32 бит, а не вообще. Так что тебе вероятно придется в регистр подгружать по 4 байта все твое 512 байтное число и поступать с ним так как в примерах.
Цитата:
Это ж чистый паскаль ))
Зато работает )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.03.2011, 20:26   #6
_Igor_
 
Аватар для _Igor_
 
Регистрация: 11.02.2011
Сообщений: 4
По умолчанию

Здравствуйте.
Извиняюсь, пример veniside'а работает, но ,действительно преобразует задом
наперёд, точнее всё число по порядку,но каждое двойное слово в обратном.
Решил пока не парится с переводом в десятичную систему.
Помогите, пожалуйста, сделать как надо.
p.s: было 512 байт, а стало 256 Кбайт) поэтому нужно что-то быстрое.
_Igor_ вне форума Ответить с цитированием
Старый 04.03.2011, 08:12   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> но каждое двойное слово в обратном

да, чё-то я затупил )
Вот, переставил местами и счётчик на 256К выставил:

Код:
          lea  esi, longbuf
          lea  edi, outbuf
          lea  ebx, xlatt
          //
          mov  ecx, 262144
    loopme:
          lodsb
          mov  edx, eax

          and  eax, 0Fh
          xlatb
          stosb

          mov  eax, edx
          shr  eax, 4
          and  eax, 0Fh
          xlatb
          stosb


          loop loopme
Да, выходной буфер не забудьте до 512К увеличить.

> поэтому нужно что-то быстрое

ггг. Если бы было 256 гиг, можно было бы о чём-то думать, а так, 256К, это слёзы, оно выполнится быстрее, чем вы отпустите Enter.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 04.03.2011, 08:33   #8
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

_Igor_
Мои пять копеек в формировании длинной строки цифр из числа, ниже программа для расчета факториала
73!=4,47011546151268434089125713812 51e+105
вывод числа из 106 цифр, причем выводит нормально, без "перекрученных двойных слов"
Код:
; masm windows gui #
.586p
.model flat
.code
include windows.inc
includelib user32.lib
extrn _imp__MessageBoxA@16:dword
n equ 73 ; от этого числа считается факториал
;19!=121645100408832000
;20!=2432902008176640000
;21!=51090942171709440000
;22!=1124000727777607680000
;23!=25852016738884976640000
;24!=620448401733239439360000 
;25!=15511210043330985984000000
;26!=403291461126605635584000000
;27!=10888869450418352160768000000
;28!=304888344611713860501504000000
;29!=8841761993739701954543616000000
;30!=2,6525285981219105863630848e+32
;31!=8,22283865417792281772556288e+33
;32!=2,6313083693369353016721801216e+35
;33!=8,68331761881188649551819440128e+36
;34!=2,9523279903960414084761860964352e+38
;35!=1,0333147966386144929666651337523e+40
;36!=3,7199332678990121746799944815084e+41
;37!=1,3763753091226345046315979581581e+43
;38!=5,2302261746660111176000722410007e+44
;39!=2,0397882081197443358640281739903e+46
;40!=8,1591528324789773434561126959612e+47
;41!=3,3452526613163807108170062053441e+49
;42!=1,4050061177528798985431426062445e+51
;43!=6,0415263063373835637355132068514e+52
;44!=2,6582715747884487680436258110146e+54
;45!=1,1962222086548019456196316149566e+56
;46!=5,5026221598120889498503054288003e+57
;47!=2,5862324151116818064296435515361e+59
;48!=1,2413915592536072670862289047373e+61
;49!=6,082818640342675608722521633213e+62
;50!=3,0414093201713378043612608166065e+64
;51!=1,5511187532873822802242430164693e+66
;52!=8,0658175170943878571660636856404e+67
;53!=4,2748832840600255642980137533894e+69
;54!=2,3084369733924138047209274268303e+71
;55!=1,2696403353658275925965100847567e+73
;56!=7,1099858780486345185404564746372e+74
;57!=4,0526919504877216755680601905432e+76
;58!=2,3505613312828785718294749105151e+78
;59!=1,3868311854568983573793901972039e+80
;60!=8,3209871127413901442763411832234e+81
;61!=5,0758021387722479880085681217663e+83
;62!=3,1469973260387937525653122354951e+85
;63!=1,9826083154044400641161467083619e+87
;64!=1,2688693218588416410343338933516e+89
;65!=8,2476505920824706667231703067855e+90
;66!=5,4434493907744306400372924024784e+92
;67!=3,6471110918188685288249859096605e+94
;68!=2,4800355424368305996009904185692e+96
;69!=1,7112245242814131137246833888127e+98
;70!=1,1978571669969891796072783721689e+100
;71!=8,5047858856786231752116764423993e+101
;72!=6,1234458376886086861524070385275e+103
;73!=4,4701154615126843408912571381251e+105
start:  mov edi,offset result+len;edi - указатель на последний байт результата
	mov esi,n
	mov dword ptr [edi-4],esi
	sub edi,8
	mov ebp,1
	dec esi
@1:	mov ecx,ebp
	xor ebx,ebx
@@:	mov eax,dword ptr [edi+4*ecx]
	mul esi
	add eax,ebx
	adc edx,0
	mov ebx,edx
	mov dword ptr [edi+4*ecx],eax
	loop @b;.untilcxz
	je @2;	.if !ZERO?
	mov dword ptr [edi],edx
	cmp dword ptr [edi+4*ebp],0
	je @f
	inc ebp
@@:	sub edi,4
@2:	dec esi
	jne @1;.until ZERO?
; big-endian --> litle-endian
	mov edi,offset result
	mov cl,len/4;длина результата в двордах
@@:	mov eax,[edi]
	bswap eax
	stosd
	loop @b
; перевожу hex->dec
	mov esi,offset terminator-1;
@3:	mov cl,len;длина в байтах значения делимого
	mov edi,offset result
	xor eax,eax
@@:	mov al,[edi];делимое
	div ten
	stosb
	loop @b
	or [esi],ah;остаток
	dec esi
	cmp dword ptr [edi-4],0;cmp result+36,0
	jne @3
	cmp dword ptr [edi-8],0;cmp result+32,0
	jne @3
	cmp dword ptr [edi-12],0;cmp result+28,0
	jne @3
; вывожу на экран
	inc esi
	push MB_OK + MB_ICONASTERISK
	push offset mesbox_title   
	push esi;offset mesbox_text с поправкой на ведущие нули
	push 0
	call _imp__MessageBoxA@16
	ret;выходим из программы
result	db 44 dup (0)
len = $-result
ten db 10
mesbox_text db 112 dup ('0')
terminator db 0
mesbox_title db 'Факториал',0
end start
Программа начала писаться для 19! и далее всё время модернизировалась, факториалы сверху взяты с виндовозного калькулятора для проверки

Последний раз редактировалось Mikl___; 04.03.2011 в 09:09.
Mikl___ вне форума Ответить с цитированием
Старый 04.03.2011, 10:45   #9
_Igor_
 
Аватар для _Igor_
 
Регистрация: 11.02.2011
Сообщений: 4
По умолчанию

Зачетно, Mikl___, возможно, я тоже скоро займусь факториалом!
veniside, извини, это мой фейл, твой первый код пашет как надо.
А суть моего фейла в том,что я объявил буфер для числа dword'ами - потому и было всё коряво!
Спасибо всем, друзья! Всё суперски работает!

Последний раз редактировалось _Igor_; 04.03.2011 в 10:58.
_Igor_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Длинное целое The riddle Помощь студентам 5 13.06.2009 15:45
Строковые типы данных,длинное целое The riddle Помощь студентам 2 13.06.2009 06:27
Длинное целое The riddle Помощь студентам 0 07.06.2009 11:06
Очень Длинное Целое Моряк Помощь студентам 2 07.06.2009 10:51
Очень длинное целое Mango Помощь студентам 3 08.09.2008 22:13