| Сейчас на форуме: (+7 невидимых) |
| eXeL@B —› Крэки, обсуждения —› MSVcrt.atol |
| Посл.ответ | Сообщение |
|
|
Создано: 15 февраля 2005 18:31 · Личное сообщение · #1 ребят, тема можь уже поднималасъ но сам чего-то запарил. Подгружаецаа МСВКРТ.ДЛЛ и вызываецца функция атол. по крайней мере Олли так выдает. Голова уже кругом идет: преобразование строки чисел в длинное целое. Вродн так. тока вот что сие значит: atol (s[, base]) Convert string s to a long integer in the given base. The string must consist of one or more digits, optionally preceded by a sign ("+" or "-"). The base argument has the same meaning as for atoi(). A trailing "l" or "L" is not allowed, except if the base is 0. Note that when invoked without base or with base set to 10, this behaves identical to the built-in function long() when passed a string. И я точно знаю что навходе строка не только с цифрами, но и с буквами G,H,I. Не в лом если поясните плизе. ![]() |
|
|
Создано: 15 февраля 2005 18:48 · Поправил: geRC · Личное сообщение · #2 atol - это перегруженная функция, может иметь один или два аргумента. Первый - указатель на строку, а второй (если есть) - т.н. "база" - основание системы счисления. Если второй аргумент отсутствует, то полагается, что система счисления = 10 mopok пишет: И я точно знаю что навходе строка не только с цифрами, но и с буквами G,H,I. Не в лом если поясните плизе. Из этого следует, что у тебя в функцию передаются два аргумента: первый - указатель на строку, а второй - система счисления. Скорее всего, что второй аргумент в твоём случае равен 24h (=36d), т.е. ты имеешь дело с т.н. base-36, когда для представления числа используется алфавит из 36 символов, обычно это "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ". ![]() |
|
|
Создано: 15 февраля 2005 20:14 · Личное сообщение · #3 Convert_Digs db '0123456789abcdefghijklmnopqrstuvwxyz',0 ;Comment % ; Stone's KeyMaker Makers include functions ; ; Converts 64 bit number in EDX:EAX to string with any number base ; ; Input: DS:EDI => Place to put string ; EDX:EAX, number to convert ; ECX, Number base ; Output: String ; Registers changed: Them all? ; Flags : Many ![]() |
|
|
Создано: 15 февраля 2005 20:23 · Поправил: Nitrogen · Личное сообщение · #4 |
|
|
Создано: 15 февраля 2005 20:36 · Поправил: geRC · Личное сообщение · #5 |
|
|
Создано: 15 февраля 2005 21:00 · Личное сообщение · #6 |
| eXeL@B —› Крэки, обсуждения —› MSVcrt.atol |




; %
Convert_Num proc near
pushf
pushAD
sub esp, 4
mov ebp,esp
cld
mov esi, edi
push esi
;--- loop for each digit
sub bh, bh
mov dword ptr [ebp], eax ;save low word
mov dword ptr [ebp+4], edx ;save high word
sub esi, esi ;count digits
Connum1:
inc esi
mov eax, dword ptr [ebp+4] ;high word of value
sub edx, edx ;clear for divide
div ecx ;divide, DX gets remainder
mov dword ptr [ebp+4],eax ;save quotient (new high word)
mov eax, dword ptr [ebp] ;low word of value
div ecx ;divide, DX gets remainder
; (the digit)
mov dword ptr [ebp], eax ;save quotient (new low word)
mov bl, dl
mov al, byte ptr [Convert_Digs+ebx] ;get the digit
stosb ;store
cmp dword ptr [ebp], 0 ;check if low word zero
jne Connum1 ;jump if not
cmp dword ptr [ebp+4], 0 ;check if high word zero
jne Connum1 ;jump if not
sub al, al
stosb ;store the terminator
;--- reverse digits
pop ecx ;restore start of string
xchg ecx, esi
shr ecx, 1 ;number of reverses
jz Connum3 ;jump if none
xchg edi, esi
sub esi, 2 ;point to last digit
Connum2 :
mov al, byte ptr [edi] ;load front character
xchg al, byte ptr [esi] ;swap with end character
stosb ;store new front character
dec esi ;back up
loopd Connum2 ;loop back for each digit
;--- finished
Connum3 :
add esp, 4
popad
popf
ret
Convert_Num endp ;Convert_Num

Для печати