Кажется будет вот так:
Сначало расскрываем
FbRightStipMask(x) ((((1 << 5)-(x)) & ((1 << 5) - 1)) ? ((-1)>>((1 << 5)-(x)) & ((1 << 5) - 1)) : 0)
FbStipMask(x,w) ((-1)<<((x) & ((1 << 5)-1))) & ((-1)>>(((1 << 5) - ((x)+(w))) & ((1 << 5)-1)));
Потом уже код (код приреплен)
Я в начале думал что это: ((FbStip) -1)
Понимается как ((FbStip) -1)=чтото, а оказалось что это просто -1
Помогите новичку
-
- Attachments
-
-
Forum_C2Asm.rar (726 Bytes)Downloaded 300 times
-
Кажется совсем туплю..
Пишу программу на С--, требуется вывести текущее время.
Код такой (содранный из @panel):
в качестве эксперимента вместо WriteDebug(EBX) пробовал:
1) Бред конечно, но
WriteDebug(#EBX)
прога с таким кодом моментально вываливается в эмуляторе, стоит лишь дойти до этого момента
2) WriteDebug(IntToStr(EBX))
на доске появляются какие-то цифры, но совсем не те.
Так, в 12:53
получилось что часов - 18, минут - 10, а секунд - 422
Выходит, тоже бред.
Кроме того, прога с таким кодом вываливается в эмуляторе, если нажать на какую-нибудь кнопку, а потом поперетягивать по экрану.
3) WriteDebug(IntToStr(#EBX))
Вообще бред, но раз всё пробую, почему бы и это не попробовать. Как и следовало ожидать, вижу на доске длинные числа "ни о чём".
Где ошибка? Всё же в DNA?
Пишу программу на С--, требуется вывести текущее время.
Код такой (содранный из @panel):
Code: Select all
EAX=3; // get time
$int 0x40
$movzx EBX,AL
$shr EAX,8
$movzx ECX,al
$shr EAX,8
$movzx EDX,al
//выведем на борду что получили
WriteDebug(EBX);
WriteDebug(ECX);
WriteDebug(EDX);
в качестве эксперимента вместо WriteDebug(EBX) пробовал:
1) Бред конечно, но
WriteDebug(#EBX)
прога с таким кодом моментально вываливается в эмуляторе, стоит лишь дойти до этого момента
2) WriteDebug(IntToStr(EBX))
на доске появляются какие-то цифры, но совсем не те.
Так, в 12:53
получилось что часов - 18, минут - 10, а секунд - 422
Выходит, тоже бред.
Кроме того, прога с таким кодом вываливается в эмуляторе, если нажать на какую-нибудь кнопку, а потом поперетягивать по экрану.
3) WriteDebug(IntToStr(#EBX))
Вообще бред, но раз всё пробую, почему бы и это не попробовать. Как и следовало ожидать, вижу на доске длинные числа "ни о чём".
Где ошибка? Всё же в DNA?
to Sorcerer
Во-первых, значения регистров могут не сохраняться, поэтому нужно их загонять в какие-либо переменные, а потом применять к ним IntToStr (опять же, строки в другие переменные). А во-вторых, какой тип принимает WriteDebug()? явно не int, подозреваю что char*, т.е. указатель на строку.
Во-первых, значения регистров могут не сохраняться, поэтому нужно их загонять в какие-либо переменные, а потом применять к ним IntToStr (опять же, строки в другие переменные). А во-вторых, какой тип принимает WriteDebug()? явно не int, подозреваю что char*, т.е. указатель на строку.
Значения регистров сохраняются, как показывает практика. Но даже если их сохранять в переменные, это не очень помогает.Nable wrote:to Sorcerer
Во-первых, значения регистров могут не сохраняться, поэтому нужно их загонять в какие-либо переменные, а потом применять к ним IntToStr (опять же, строки в другие переменные). А во-вторых, какой тип принимает WriteDebug()? явно не int, подозреваю что char*, т.е. указатель на строку.
Что интересно -
Code: Select all
EAX=3;
$int 0x40
а последующий код по идее должен сделать из всего этого просто цифры. но он каждый раз выдает одно и то же
кажется я реально туплю
Должно ведь быть что-то простое?
ага, кажется разобрался. действительно туплю.
Если не трудно, подскажите оптимальный алгоритм получения из 0x00ssmmhh нормальных чисел?
Такое впечатление, что C-- просто не знает о регистре al, иногда в warnings.log и errors.log сообщая, что переменная не задана.
Пока использую такой код
работает отлично, что и ожидалось, но он явно далеко не идеален 
Если не трудно, подскажите оптимальный алгоритм получения из 0x00ssmmhh нормальных чисел?
Такое впечатление, что C-- просто не знает о регистре al, иногда в warnings.log и errors.log сообщая, что переменная не задана.
Пока использую такой код
Code: Select all
dword a;
dword s;
dword m;
dword h;
dword t;
// ......
$mov eax,3; // ; get time
$int 0x40
a=EAX;
WriteDebug(IntToStr(a));
t=a/16;
t=t*16;
h=a-t;
a=a/16;
t=a/16;
t=t*16;
s=a-t;
h=s*10+h;
a=a/16;
t=a/16;
t=t*16;
m=a-t;
a=a/16;
t=a/16;
t=t*16;
s=a-t;
m=s*10+m;
WriteDebug(IntToStr(h));
WriteDebug(IntToStr(m));
Вот код из shell (файл cmd_date.c):
Code: Select all
unsigned time = kol_system_time_get();
printf("\n\r time [hh:mm:ss]: %x%x:%x%x:%x%x\n\r",
(time&0xf0)>>4, (time&0xf), // hours
(time&0xf000)>>12, (time&0xf00)>>8, // minutes
(time&0xf00000)>>20, (time&0xf0000)>>16 ); // seconds
В строку переводить можно, например, так:
Code: Select all
str1 db '??:??:??',0
...
mov esi,str1
mov eax,3
int 0x40
mov ebx,eax
aam 16
shr ebx,8
add ax,'00'
mov [esi],ah
mov [esi+1],al
mov eax,ebx
aam 16
shr ebx,8
add ax,'00'
mov [esi+3],ah
mov [esi+4],al
mov eax,ebx
aam 16
add ax,'00'
mov [esi+6],ah
mov [esi+7],al
Ушёл к умным, знающим и культурным людям.
Спасибо огромное! Буду разбираться дальше 
у меня будет немного странная просьба =) в общем я давно написал код функции (вроде как я написал, т.к. код в файле мой вроде весь должен быть), но не помню что она делает =( никакой дополнительной информации сообщить не могу, т.к. функцию нигде не применял, и писал в отрыве от разных проектов.. в общем помогите понять что делает эта функция пожалуйста)
Code: Select all
proc strints stdcall root:dword, lenght:dword
pushad
xor esi, esi
mov [strints_result],esi
xor edi,edi
mov eax,dword[root]
mov ecx,dword[lenght]
add eax,ecx
@@:
inc esi
mov dl,byte[eax-esi]
dec esi
shl dl,4
add dl,byte[eax-esi]
add esi,2
mov [edi+strints_result],dl
inc edi
cmp esi,ecx
jb @b
jne @f;if only one letter lost
mov dl,byte[eax-ecx]
mov [edi+strints_result],dl
@@:
popad
ret 8
endp
strints_result dd ?Похоже, что эта функция переводит число из строки, где в каждом байте записана одна шестнадцатеричная цифра (не как символ, а как число) в число (little endian).
Вот примерный аналог на (почти) Python:
Вот примерный аналог на (почти) Python:
Code: Select all
esi=0
strints_result=0
edi=0
while esi<length:
dl = root[length-esi-1]*16+root[length-esi]
strints_result[edi]=dl
esi+=2
edi+=1
if esi!=ecx:
dl = root[0]
strints_result[edi] = dl
Как можно выводить в программе текст, в котором около 255 и более символов?
Code: Select all
...
mov eax,4
mov ebx,5*65536+75
mov ecx,0x01FFFF99
mov edx,longtext
mov esi,255
int 0x40
...
longtext db 'more 255...'
а зачем? разве влезет 255*6 = 1530 пикселов в экран, учитывая что Колибри разрешение больше 1280*сколько-то не держит?
И мы уже давно не пешки,
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!
kogemyaka
Разбивать его на части, как например делает Tinypad.
Gluk
ЕМНИП Serge сделал под экранный буфер 8 Мб, дальше считай сам. Все зависит от оборудования, в Vesa режиме.
Разбивать его на части, как например делает Tinypad.
Gluk
ЕМНИП Serge сделал под экранный буфер 8 Мб, дальше считай сам. Все зависит от оборудования, в Vesa режиме.
1440*сколько-то у меня оборудование держит, а Колибри - нет. Я говорю то, что вижу..
И мы уже давно не пешки,
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!
Gluk
Если оборудование поддерживает в Vesa режимах, а не с помощью специализированного драйвера.
Если оборудование поддерживает в Vesa режимах, а не с помощью специализированного драйвера.
Who is online
Users browsing this forum: No registered users and 9 guests