Помогите новичку

Applications development, KoOS API questions
  • Кажется совсем туплю..
    Пишу программу на С--, требуется вывести текущее время.
    Код такой (содранный из @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*, т.е. указатель на строку.
  • Nable wrote:to Sorcerer
    Во-первых, значения регистров могут не сохраняться, поэтому нужно их загонять в какие-либо переменные, а потом применять к ним IntToStr (опять же, строки в другие переменные). А во-вторых, какой тип принимает WriteDebug()? явно не int, подозреваю что char*, т.е. указатель на строку.
    Значения регистров сохраняются, как показывает практика. Но даже если их сохранять в переменные, это не очень помогает.
    Что интересно -

    Code: Select all

    EAX=3;
    $int 0x40
    
    работает превосходно. То есть выдает время в BCD да ещё в формате 0x00ssmmhh
    а последующий код по идее должен сделать из всего этого просто цифры. но он каждый раз выдает одно и то же :(
    кажется я реально туплю :((

    Должно ведь быть что-то простое?
  • ага, кажется разобрался. действительно туплю.
    Если не трудно, подскажите оптимальный алгоритм получения из 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:

    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 режиме.
  • 1440*сколько-то у меня оборудование держит, а Колибри - нет. Я говорю то, что вижу..
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • Gluk
    Если оборудование поддерживает в Vesa режимах, а не с помощью специализированного драйвера.
  • Who is online

    Users browsing this forum: No registered users and 9 guests