Начало  Регистрация  Поиск  FAQ  Разные разности  Новости Форума  Администрация Клуба  RSS

Siemens - клуб

 
 SC-форум : Hard&Soft : Программирование под ARM. Технические вопросы

Навигация:
Хозяйке на заметку: У Вас смартфон Siemens SX1? А Вы были здесь? Не были? Ну тогда срочно загляните! А если и были, то зайдите еще раз, вдруг что-нибудь новенькое появилось ;)

Автор Сообщение
avkiev
Исследователь
Признанный телефонист
С нами с: 20.09.2002
Плодовитость: 2088


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Рейтинг

Подано 355 (329/26) голосов
icon Программирование под ARM. Технические вопросы


Поскольку в теме FAQ начинающего прошивкокопателя. обсуждается уже непонятно что - решил создать новую тему для обсуждения технических вопросов программирования под ARM. Предлагаю в старой обсуждать только C166.

Для начала - обсудим вопрос портирования патчей.
Основная проблема, с которой сталкиваются патчпортеры - "слишком далекие ссылки" (| $ - Sub | > 4M). Кто знает - тот поймет. Что же делать ?

Наиболее простое решение выглядит так: заменяем команду "BL Sub" на две - "LDR R3, [pSub]; BLX R3", а в конце патча по адресу pSub дописываем 4-х байтное слово Sub. Тут выбран регистр R3 потому, что обычно его содержанием можно пожертвовать. Если нет - то надо использовать другой регистр или дописывать в конце патча не просто слово, а свою коротенькую процедурку.

Рассмотрим этот метод на примере портирования патча "Чтение SMS при заблокированной клавиатуре" на S65v50.
Нужно дотянуться с адреса A080091A до A0C55C40+1, патч заканчивается перед адресом A0800970.
Получаем следующее:
080091A: 154B ; LDR R3, [pSub]
080091C: 9847 ; BLX R3 (98 = 80 + 8 * 3) - R3
0800970: 415CC5A0 ; pSub: Sub

Пояснения к первой строке:
4B = 48 + 3 (так как используется регистр R3)
15 = (800970-80091A-2)/4 = 56/4

Возможно, я где то наврал с цифрами, но алгоритм, надеюсь, ясен. Изучайте набор команд ARM.
Хороших всем портов

14.07.2005 в 08:33
me-at
Начинающий телефонист
Откуда: UA, Kyiv
С нами с: 11.05.2005
Плодовитость: 4


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме cx65
Рейтинг

Подано 0 (0/0) голосов
icon Re: Программирование под ARM. Технические вопросы


Для копания в х65:
Железо на x65 (фото)
http://forum.allsiemens.com/viewtopic.php?t=7162&postdays=0&postorder=asc&start=0 (чем копать, куда тыкать...)

14.07.2005 в 10:56
1nvisible
Телефонист
С нами с: 30.06.2005
Плодовитость: 287


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Предупреждения:
ЗамечаниеЗамечание
Рейтинг

Подано 49 (40/9) голосов
icon Re: Программирование под ARM. Технические вопросы


Уважаемые патчеры!
Помогите пожалуйста, хочу научиться ПОРТИРОВАТЬ патчи (для моего SK65 их очень мало). Не могли бы вы привести пример портирования какого либо одного патча с комментариями? Огромная просьба не отсылать меня в тему "FAQ начинающего прошивкокопателя" и на allsiemens.com, я там ничего не нашел.
Заранее спасибо!

14.07.2005 в 16:53
avkiev
Исследователь
Признанный телефонист
С нами с: 20.09.2002
Плодовитость: 2088


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Рейтинг

Подано 355 (329/26) голосов
icon Re: Программирование под ARM. Технические вопросы


В качестве учебного пособия выкладываю реальный проект под Кейл с патчем "Расширенный список вызовов" для S65v50.
Сам Кейл скачать можно здесь: http://www.keil.com/demo/eval/arm.htm (15 метров, нужна регистрация).
Сам патч примитивен, интерес представляет общее описание проекта и инклюд-файл для S65v50.
В свойствах проекта указываем: Device - ARM 9E-S (Little Endian)
На вкладке Output - Create HEX-file, HEX-format: HEX-386, в строке RunUserProgram пишем: ..\hex2vkp -Fe:\Siemens\Data\S65_5003.bin %H
Программа Hex2VKP входит в архив, это чуток мной заточенная под х65 тулза от Redkin'а.
В качестве параметра она получает имя файла-фф и имя hex-файла.
Инклюд-файл S65_50.inc состоит как бы из двух частей:
1 - Адреса наиболее часто используемых функций прошивки и переменных в памяти.
2 - Несколько макросов для корректной работы Кейла (тупит он на некоторых командах).

Для работы с примером нужно:
- установить Кейл
- Раскрутить прилагаемый архив
- открыть проект (дабл-клик по uv2-файлу)
- в опциях проекта указать путь к вашему фф от S65v50
- открыть в другом окне vkp-файл
- Project - RebuildAllTargetFiles
- обновить vkp-файл в другом окне и пытаться применить его к телефону...

Разумеется, нужно знание системы команд процессора ARM, понимание Thumb/ARM режимов работы и голова на плечах.

Не уверен, что это многим интересно, не люблю я писать доки и мануалы, будут вопросы - спрашивайте...

Список прикрепленных файлов
 calls.jar  (65821 bytes)

18.07.2005 в 14:21
avkiev
Исследователь
Признанный телефонист
С нами с: 20.09.2002
Плодовитость: 2088


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Рейтинг

Подано 355 (329/26) голосов
icon Re: Программирование под ARM. Технические вопросы


Идем дальше. Выкладываю исходник патча "Динамический оператор", желающие могут попробовать собрать проект и попытаться его скомпилировать. Специально выкладываю только исходник, а не весь проект - для повторения прошлого урока
Это уже большой, серьезный патч, можно попробовать с ним поразбираться.
[code]$ARM9E
$genonly

Vrezka equ 16B1D9Ch
Patch equ 0800100h

$INCLUDE (..\S65_50.inc)

AddImm  macro   imm
              mov     r3, #imm
              add     r5, #2
              strh   r3, [r4,r5]
endm

AddReg  macro   reg
              add     r5, #2
              strh   reg, [r4,r5]
endm

; ---------------------------------------------------------------------------
; ---------------------------------------------------------------------------
org     Patch
Format:     db      34h, 06h, 09h, 08h, 0BAh, 0CDh, 0DEh, 0Fh
            db      34h, 06h, 09h, 08h, 0BAh, 0CDh, 0DEh, 0Fh
            db      34h, 06h, 09h, 08h, 0BAh, 0CDh, 0DEh, 0Fh
            db      34h, 06h, 09h, 08h, 0BAh, 0CDh, 0DEh, 0Fh

            db      10h,4,11h,4,12h,4,31h,0
            dd      0, 0, 0, 0, 0, 0
            db      "Dyn. provider v8"
            db      "©avkiev 24.06.05"
; ---------------------------------------------------------------------------
Entry:      PUSH    {r0,r1,r4,r5,r7,LR}
            ; r4-buffer, r5-counter, r6-format, r7-rama
            
            bl      GetProfile-q1
            add     r0, #1
            cmp     r0, #7
            pop     {r0,r1}
            push    {r0,r1}
            bne     DoPatch
            bl      GetProvider-q1
            b       expatch

DoPatch:    ldr     r4, [r0]
            mov     r5, #0
            LoadReg 7, aRama

            LoadReg 0, aIsScreenSaver
            blx     r0
            lsl     r6, r0, #1
            LoadReg 0, aIsUnlocked
            blx     r0
            add     r6, #1
            sub     r6, r0
            lsl     r6, #3

            ldr     r0, [r7, #10h]
            add     r0, #1
            mov     r1, #7
            and     r0, r1
            str     r0, [r7, #10h]

            LoadReg 3, aFormat
            add     r6, r3
            ldrb    r6, [r6, r0]

            mov     r0, r7       ; Date
            mov     r1, r7
            add     r1, #8       ; Time
            LoadReg 3, aGetDateTime
            blx     r3

;           mov     r6, #0x08    ; ==============
ProcessR6:  cmp     r6, #16
            bcc     nibble2
            lsr     r3, r6, #4
            bl      ProcessR3
            AddImm  " "
nibble2:    mov     r3, #0Fh
            and     r3, r6
            bl      ProcessR3
            
            lsr     r5, #1
            strh    r5, [r4]
expatch:    pop     {r0,r1,r4,r5,r7,PC}
; ---------------------------------------------------------------------------
ProcessR3:  push    {r3, LR}
            mov     r0, r7
            bl      GetWeek - q1
            pop     {r3}
            lsl     r3, #1
            add     PC, r3
fun0:       pop     {PC}
; ---------------------------------------------------------------------------
            b       fun0
            b       fun1
            b       fun2
            b       fun3
            b       fun4
            b       fun5
            b       fun6
            b       fun7
            b       fun8
            b       fun9
            b       funA
            b       funB
            b       funC
            b       funD
            b       funE
            b       funF
; ---------------------------------------------------------------------------
fun1:       LoadReg 0, aFormat          ; Uni-string
            add     r0, #20h
            b       AddUni+2
; ---------------------------------------------------------------------------
fun2:       LoadReg 0, aFiledp          ; Filename
            mov     r2, #0
            b       AddTMO+2
; ---------------------------------------------------------------------------
fun3:       ldrb    r1, [r7, #8]        ; Time 10:26
            bl      Add2Dig
            AddImm  ":"
            ldrb    r1, [r7, #9]
            b       Add2Dig+2
; ---------------------------------------------------------------------------
fun4:       bl      AddDay              ; Date 11.02.2005
            AddImm  "."
            ldrb    r1, [r7, #4]
            bl      Add2Dig
              mov     r3, #"."
            b       AddYear
; ---------------------------------------------------------------------------
fun5:       ldrb    r1, [r7, #4]        ; Date 02/11/2005
            bl      Add2Dig
            AddImm  "/"
            bl      AddDay
              mov     r3, #"/"
            b       AddYear
; ---------------------------------------------------------------------------
fun6:       LoadReg 1, aMonthShort     ; Date We, 11 Feb 2005
            add     r1, #13
            bl       AddMes
            AddImm  ","
            AddImm  " "
            bl      AddDay
            AddImm  " "
            ldrb    r0, [r7, #4]
            LoadReg 1, aMonthShort
            bl       AddMes
              mov     r3, #" "
AddYear:      add     r5, #2
              strh   r3, [r4,r5]
            ldrh    r1, [r7]
            b       Add4Dig+2
; ---------------------------------------------------------------------------
fun7:       ldrb    r0, [r7, #4]        ; Date February, 10
            mvi     r1, 118Bh
            bl      AddMes
            mov     r3, #","
            strh r3, [r4,r5]
            AddImm  " "
            ldrb    r1, [r7, #5]
            b       Add2Dig+2
; ---------------------------------------------------------------------------
;            db      0xD6, 0xE2, 0xD7, 0xD8, 0xD9, 0xDA, 0xD5, 0
;fun8:       mov     r1, PC              ; Понедел.
;            sub     r1, #12
;            ldrb    r0, [r1, r0]
;            b       r1_400

;            mov     r0, r7
;            str     r4, [r0]
fun8:       pop     {r0}
            pop     {r0,r1,r4,r5,r7}
            pop     {r2}
            mov     lr, r2
            LoadReg 2, aMiniGPS
            bx      r2
; ---------------------------------------------------------------------------
fun9:       add     r0, #1              ; Понедельник
            cmp     r0, #7
            bne     r1_400
            mov     r0, #0
r1_400:     mov     r1, #4
            lsl     r1, #8
            b       AddMes+2
; ---------------------------------------------------------------------------
funA:       mov     r0, #0              ; 3,812 = 25%
            mov     r1, #9
            LoadReg 2, aGetAkku
            blx     r2
            add     r5, #2
            bl      Add4Dig0

            sub     r5, #6
            bl      InsComma
            add     r5, #6
            mov     r3, #" "
            strh    r3, [r4,r5]
            AddImm  "="

funA_2:     LoadReg 1, aRamCap
            AddImm  " "
            ldrh    r1, [r1]
            cmp     r1, #100
            bcc     less100
            AddImm  "1"
            mov     r1, #0
less100:    bl      Add2Dig
            AddImm  "%"
            pop     {PC}
; ---------------------------------------------------------------------------
funB:       mov     r0, #1              ; 25,7'C
            mov     r1, #3
            LoadReg 2, aGetAkku
            blx     r2
            mvi     r1, 2730
            sub     r0, r1
            mov     r1, #0
            lsl     r2, r1, #24
            asr     r1, r2, #24
            add     r0, r1

            bpl     plus
            AddImm  "-"
            neg     r0, r0

plus:       bl      Add4Dig0
            sub     r5, #4
            bl      InsComma
            bl      InsComma
            AddImm  0xB0
            AddImm  "C"
            pop     {PC}
; ---------------------------------------------------------------------------
funC:       mov     r0, r7
            add     r0, #14h
            add     r1, r4, r5          ; UMC
            str     r1, [r0]
            ldrh    r2, [r1]
            push    {r2}
            bl      GetProvider-q1
            pop     {r2}

            ldrh    r1, [r4, r5]
            strh    r2, [r4, r5]
            lsl     r1, #1
            add     r5, r1
            pop     {PC}
; ---------------------------------------------------------------------------
funD:                                   ; -65 dB
            mov     r3, #"-"          ; 900
            LoadReg 0, aRamNetCH
            ldrh    r1, [r0]
            cmp     r1, #0xFF
            bcc     n1800
              mov     r3, #"="          ; 1800
n1800:        add     r5, #2
              strh   r3, [r4,r5]
            ldrb    r1, [r0, #6]
            cmp     r1, #100
            bcc     NetLess100
            AddImm  "1"
            sub     r1, #100
NetLess100: bl      Add2Dig
            AddImm  " "
            AddImm  "d"
            AddImm  "B"
            pop     {PC}
; ---------------------------------------------------------------------------
funE:       LoadReg 0, aRamNetCH      ; 804:01589-9110
            ldrh    r1, [r0]
            bl      Add4Dig
            mov     r0, #20h
            sub     r1, r5, #6
            strh    r0, [r4, r1]
            AddImm  ":"

funE_2:     LoadReg 0, aRamNetCH
            add     r0, #2
            bl      Add5Dig
            AddImm  "-"
            LoadReg 0, aRamNetCH
            ldrh    r1, [r0, #4]
            b       Add4Dig+2
; ---------------------------------------------------------------------------
funF:       sub     SP, #40
            LoadReg 0, aRamNetCH
            ldrh    r2, [r0, #4]
            ldrh    r3, [r0, #2]
            str     r2, [SP]
            add     r0, SP, #4
            LoadReg 1, aFiledp
            add     r1, #18h
            CallARM sprintf

            add     r0, SP, #4
            mov     r2, #4
            bl      AddTMO
            add     SP, #40
            bpl     exTMO
            pop     {r6}
            mov     r6, #08h
            b       ProcessR6
; ---------------------------------------------------------------------------
; Subroutine
; ---------------------------------------------------------------------------
AddTMO:     push    {LR}
            mov     r1, r7
            add     r1, #18h
            push    {r2}
            bl      OpenReadCloseFile - q1
            pop     {r2}
            bmi     exTMO

            ldr     r0, [r7, #18h]
            ldrh    r1, [r0]
            lsl     r1, #1
            add     r0, #2
            mov     r3, #0
            strh    r3, [r0, r1]
            add     r0, r2
            bl      AddUni
            ldr     r0, [r7, #18h]
            bl      mFree_high - q1
            mov     r0, #0
exTMO:      pop     {PC}
; ---------------------------------------------------------------------------
AddUni:     push    {LR}
            ldrh    r3, [r0]
            add     r0, #2
            add     r5, #2
            strh r3, [r4,r5]
            cmp     r3, #0
            bne     AddUni+2
            sub     r5, #2
            pop     {PC}
; ---------------------------------------------------------------------------
AddMes:     push    {LR}
            add     r0, r1          ; r0+r1 - Mes
            mov     r1, r7
            add     r1, #18h
            LoadReg 3, aGetLP
            blx     r3
            mov     r0, r7
            add     r0, #18h

mod0:       mov     r1, #0          ; AddUniFromSiem
newmod:     lsl     r2, r1, #4
nextchs:    ldrb    r3, [r0]
            add     r0, #1
            cmp     r3, #0
            beq     byeAUFS
            cmp     r3, #0xA4
            beq     byeAUFS
            cmp     r3, #95h
            beq     mod0

            mov     r1, #8h
            cmp     r3, #96h
            beq     newmod
            mov     r1, #10h
            cmp     r3, #97h
            beq     newmod
            mov     r1, #38h
            cmp     r3, #9Ah
            beq     newmod
            mov     r1, #40h
            cmp     r3, #9Bh
            beq     newmod

            add     r3, r2
            add     r5, #2
            strh r3, [r4,r5]
            b       nextchs
byeAUFS:    pop     {PC}
; ---------------------------------------------------------------------------
AddDay:     ldrb    r1, [r7, #5]
Add2Dig:    push    {LR}
            mov     r0, #10
            CallARM     DivR1byR0
            add     r0, #30h
            AddReg  r0
            add     r1, #30h
            AddReg  r1
            pop     {PC}
; ---------------------------------------------------------------------------
Add4Dig0:   mov     r1, r0
Add4Dig:    push    {LR}
            mov     r0, #100
            CallARM     DivR1byR0
            push    {r1}
            mov     r1, r0
            bl      Add2Dig
            pop     {r1}
            b       Add2Dig+2
; ---------------------------------------------------------------------------
Add5Dig:    push    {LR}            ; r0 - address
            ldrh    r1, [r0]
            mvi     r0, 10000
            CallARM     DivR1byR0
            add     r0, #30h
            AddReg  r0
            b       Add4Dig+2
; ---------------------------------------------------------------------------
InsComma:   push    {LR}
            ldrh    r0, [r4,r5]
            mov     r1, #","
            strh    r1, [r4, r5]
            sub     r5, #2
            strh    r0, [r4, r5]
            add     r5, #4
            pop     {PC}
; ---------------------------------------------------------------------------
            Align4
aGetDateTime:dd     GetDateTime
aGetAkku:   dd      GetAkku
aGetLP:     dd      GetLP
aIsUnlocked:dd      IsUnLocked
aIsScreenSaver: dd  IsScreenSaver

aRamCap:    dd      RamCap
aRamNetCH:  dd      RamNetCH

aMonthShort:dd      1297h
aFormat:    dd      q0+Format

aFiledp:    dd      q0+Filedp
aMiniGPS:   dd      q1+0x0801506
Filedp:     db      "0:\Misc\DynProvider.tmo",0
Filegps:    db      "0:\Misc\gps\%i\%i-%i.tmo"
aRama:      dd      Rama
; ---------------------------------------------------------------------------
org Vrezka
            dd      q1+Entry
; ---------------------------------------------------------------------------
END
[/code]

19.07.2005 в 09:12
1nvisible
Телефонист
С нами с: 30.06.2005
Плодовитость: 287


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Предупреждения:
ЗамечаниеЗамечание
Рейтинг

Подано 49 (40/9) голосов
icon Re: Программирование под ARM. Технические вопросы


2 avkiev:
Огромное спасибо за ответ (поставил +), портировал патч "Расширенный список вызовов".
У меня есть еще пара вопросов.
Первый.
Пишу
[code]ldr r3, =0xA04F4703
blx r3[/code]
на что компилятор выдает ошибку
Numeric value out of range. Когда делал то же самое через Дебаггер, все компилировалось.
Второй вопрос.
Хотелось бы портировать патч miniGPS. Но возникает несколько проблем. В интернете есть исходник на с. Там есть строчка

цитата:
#include "..\shared\x65.h"

Где взять этот файл x65.h? Или надо самому прописывать все функции в заголовочном файле. Как правильно написать программу на с? Я попробовал написать программу из одной инструкции (SwitchPhoneOff()), получился огромный файл:
[code]0000010: 18F09FE50000A0E118F09FE518F09FE5
0000020: 40000000580600005406000050060000
0000030: 4C060000000000004806000044060000
0000040: 5C009FE5DBF021E300D0A0E1040040E2
0000050: D7F021E300D0A0E1040040E2D1F021E3
0000060: 00D0A0E1400040E2D2F021E300D0A0E1
0000070: 800040E2D3F021E300D0A0E1400040E2
0000080: 10F021E300D0A0E118009FE5010010E3
0000090: 14E09F0514E09F1510FF2FE1FEFFFFEA
00000A0: FEE7C046BC050000E50500009C000000
00000B0: A1000000
00005BC: 00000000080000000000000000000000
00005CC: 000000000800000070F897A0AC2B2BA0
00005DC: 0000000000000000114806C80B1C1343
00005EC: 05D000230B70491C9142FBD1F5E70D48
00005FC: C01C0323984306C80B1C134306D00378
000060C: 401C0B70491C9142F9D1F1E700B52F20
000061C: 0121022204231B6800F009F800BDC046
000062C: BC050000CC0500000047084710471847
000063C: 2047284730473847FEFFFFEAFEFFFFEA
000064C: FEFFFFEAFEFFFFEAFEFFFFEAFEFFFFEA
[/code]
И последний вопрос.
Не все стандартные функции определяются Smelter'ом (например GetVibraStatus, PlayFile...). Как можно на них выйти?
P.S. Извините, если вопросы ламерские, просто очень хочется написать что-нибудь для своего телефоа.
19.07.2005 в 15:23
avkiev
Исследователь
Признанный телефонист
С нами с: 20.09.2002
Плодовитость: 2088


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Рейтинг

Подано 355 (329/26) голосов
icon Re: Re: Программирование под ARM. Технические вопросы


цитата:
1nvisible пишет: ldr r3, =0xA04F4703
blx r3
на что компилятор выдает ошибку
Numeric value out of range

Кейл тупит на команде LDR, попробуй использовать макрос LoadReg.
цитата:
1nvisible пишет: #include "..\shared\x65.h"
Где взять этот файл x65.h?
Не все стандартные функции определяются Smelter'ом (например GetVibraStatus, PlayFile...). Как можно на них выйти?

Тут посмотри:
http://d23.2chaos.de/index.php?page=functions&lang=en&mid=2
цитата:
1nvisible пишет: Как правильно написать программу на с? Я попробовал написать программу из одной инструкции (SwitchPhoneOff()), получился огромный файл:
Поэтому я и пишу на асме - на С теряешь полный контроль над кодом
19.07.2005 в 15:41
kirik64
Признанный телефонист
В миру: Кирилл
Откуда: Россия, Москва
С нами с: 14.01.2004
Плодовитость: 697


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме S65SL65CX65
Предупреждения:
Строгое предупреждениеЗамечание
Рейтинг

Подано 127 (98/29) голосов
icon Re: Программирование под ARM. Технические вопросы


1nvisible пишет:
Поздравляю с дебютом, во-первых
Во-вторых, приаттачиваю x65.h, который я у себя обнаружил. Но он для s65v43, так что надо разбираться...
цитата:
Не все стандартные функции определяются Smelter'ом (например GetVibraStatus, PlayFile...). Как можно на них выйти?

Кое-какие надо искать руками, будь то через Иду или ВинХекс. К примеру, для некоторых функций в патче RMWKL я с ходу стандартных паттернов не нашёл... только применительно к конкретному телефону
цитата:
Хотелось бы портировать патч miniGPS

Его сложность - в первую очередь в наличии 21 функции и 1 массива из рамы - это рекорд на данный момент. Пиши в личку или в мыло, чем смогу, помогу
avkiev пишет:
цитата:
на С теряешь полный контроль над кодом

Позволю себе не согласиться - грамотная программа на Си даже удобнее для восприятия такому дилетанту, как ваш покорный слуга... для порта, конечно...
avkiev~у ваще (r)^~
Список прикрепленных файлов
 x65.h  (2998 bytes)



____________________________
WE'RE CHAINED TO THE WORLD AND WE ALL GOTTA PULL (Tom Waits,"Bone Machine")

19.07.2005 в 18:50
avkiev
Исследователь
Признанный телефонист
С нами с: 20.09.2002
Плодовитость: 2088


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Рейтинг

Подано 355 (329/26) голосов
icon Re: Re: Программирование под ARM. Технические вопросы


цитата:
kirik64 пишет: грамотная программа на Си даже удобнее для восприятия
Для восприятия - да, конечно, С читабельнее, чем асм.
Возможно, и начинать патчерам-новичкам нужно именно с С.
Но это уже без меня...
20.07.2005 в 06:49
1nvisible
Телефонист
С нами с: 30.06.2005
Плодовитость: 287


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Предупреждения:
ЗамечаниеЗамечание
Рейтинг

Подано 49 (40/9) голосов
icon Re: Программирование под ARM. Технические вопросы


Еще раз (r) и (+) avkiev'у и kirik'у за помощь.
Но у меня есть еще много вопросов
Например, чтобы портировать какой-либо патч, нужно фф от исходного телефона загрузить в IDA и посмотреть, как действует патч.
Но у меня, к сожалению, нет фф от других телефонов, отсюда вопрос, где достать фф 50 прошивки?
Далее, у меня какая-то проблема с IDA. Мне кажется, она неверно интерпретирует команды. Приаттачиваю скриншот из все того же патча "Расширенный список вызовов". Помогите, пожалуйста, с этим разобраться.

Список прикрепленных файлов
 ida.JPG  (35342 bytes)

20.07.2005 в 11:20
avkiev
Исследователь
Признанный телефонист
С нами с: 20.09.2002
Плодовитость: 2088


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Рейтинг

Подано 355 (329/26) голосов
icon Re: Re: Программирование под ARM. Технические вопросы


цитата:
1nvisible пишет: 1. где достать фф 50 прошивки?
2. Далее, у меня какая-то проблема с IDA. Мне кажется, она неверно интерпретирует команды.

1. Искать и спрашивать в форуме по х65.
2. Ты в АРМ-режиме. Надо переключиться в Тумбу: Alt-G - 1 - Ok
20.07.2005 в 11:29
1nvisible
Телефонист
С нами с: 30.06.2005
Плодовитость: 287


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Предупреждения:
ЗамечаниеЗамечание
Рейтинг

Подано 49 (40/9) голосов
icon Re: Программирование под ARM. Технические вопросы


Возникла проблема при портировании патча * Защита паролем важных функций телефона v3 *.
В коде содержатся две ссылки на адреса 0xA8xxxxxx (насколько я понял, это RAM). Для разных телефонов они разные. Прошу автора патча, avkiev'а, помочь разобраться, куда ведут эти ссылки и как мне их портировать на SK65.

22.07.2005 в 14:13
avkiev
Исследователь
Признанный телефонист
С нами с: 20.09.2002
Плодовитость: 2088


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Рейтинг

Подано 355 (329/26) голосов
icon Re: Re: Программирование под ARM. Технические вопросы


цитата:
1nvisible пишет: Прошу автора патча, avkiev'а, помочь разобраться, куда ведут эти ссылки и как мне их портировать на SK65.
Одна из них - просто свободное место в раме.
Для того чтобы найти вторую надо проанализировать фрагмент Иды на существующем патче, найти аналог этого фрагмента у себя и увидеть этот адрес
22.07.2005 в 14:28
1nvisible
Телефонист
С нами с: 30.06.2005
Плодовитость: 287


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Предупреждения:
ЗамечаниеЗамечание
Рейтинг

Подано 49 (40/9) голосов
icon Re: Программирование под ARM. Технические вопросы


На один адрес вышел, а вот что делать со вторым, который ведет на

цитата:
свободное место в раме

Подставил туда адрес, где у меня в раме были нули - вылетаю с сообщением Prefetch_Abort! 0xFFFFFB44, если заходить через меню (поставил пароль на "Исходящие" и "Входящие"). Если через Меню->Поиск, то работают только "Входящие", а "Отправленные также вырубают телефон.
22.07.2005 в 16:06
avkiev
Исследователь
Признанный телефонист
С нами с: 20.09.2002
Плодовитость: 2088


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Рейтинг

Подано 355 (329/26) голосов
icon Re: Re: Программирование под ARM. Технические вопросы


цитата:
1nvisible пишет: Подставил туда адрес, где у меня в раме были нули - вылетаю с сообщением
Ищи не нули, а эфэфы
22.07.2005 в 16:09
1nvisible
Телефонист
С нами с: 30.06.2005
Плодовитость: 287


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Предупреждения:
ЗамечаниеЗамечание
Рейтинг

Подано 49 (40/9) голосов
icon Re: Программирование под ARM. Технические вопросы


Спасибо, но баг был не совсем в этом (в самом патче кое-что напортачил).
У меня такой вопрос: как найти в раме массив дата-время? Почитал на http://d23.2chaos.de его описание, но ничего не понял (коряво там написано как-то - например, где месяц описывается, там 07 D5 - это какой месяц-то?). Дайте, пожалуйста понятное описание.

P.S. Почему нельзя поставить несколько (+)'сов одному участнику? А то я бы avkiev'у за его помощь поставил бы штук 10
P.P.S. Супер - я теперь Телефонист!

22.07.2005 в 21:11
avkiev
Исследователь
Признанный телефонист
С нами с: 20.09.2002
Плодовитость: 2088


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Рейтинг

Подано 355 (329/26) голосов
icon Re: Re: Программирование под ARM. Технические вопросы


цитата:
1nvisible пишет: 07 D5 - это какой месяц-то?
0x07D5 = 2005 - Год
Дальше - месяц
25.07.2005 в 09:18
avkiev
Исследователь
Признанный телефонист
С нами с: 20.09.2002
Плодовитость: 2088


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Рейтинг

Подано 355 (329/26) голосов
icon Исходники


Выкладываю еще несколько исходников, кому надо - тот разберется

Список прикрепленных файлов
 bottom_date.arm.txt  (2785 bytes)
 alerts.arm.txt  (7854 bytes)
 alarm.arm.txt  (1134 bytes)
 SpellTime.arm.txt  (5238 bytes)

25.07.2005 в 09:23
~Jhellico
Начинающий телефонист
В миру: Сергей
Откуда: Украина, Чернигов
С нами с: 25.03.2005
Плодовитость: 12


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме CX65
Рейтинг

Подано 11 (10/1) голосов
icon Re: Программирование под ARM. Технические вопросы


В процессе исследования возник вопрос: почему некоторые функции прошивки вызываются через <адрес функции + 1>, а не <адрес функции>?

02.08.2005 в 12:05
avkiev
Исследователь
Признанный телефонист
С нами с: 20.09.2002
Плодовитость: 2088


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Рейтинг

Подано 355 (329/26) голосов
icon Re: Re: Программирование под ARM. Технические вопросы


цитата:
~Jhellico пишет: В процессе исследования возник вопрос: почему некоторые функции прошивки вызываются через <адрес функции + 1>, а не <адрес функции>?
Они написаны в тумб-режиме
02.08.2005 в 12:07
1nvisible
Телефонист
С нами с: 30.06.2005
Плодовитость: 287


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Предупреждения:
ЗамечаниеЗамечание
Рейтинг

Подано 49 (40/9) голосов
icon Re: Программирование под ARM. Технические вопросы


Почитал систему команд ARM, не понял одной - LSL.
Что это за команда и что она делает в данном примере (патч "Флеш-СМС")?
[code]$arm9e                          



AREA   STARTUPCODE, CODE, AT 0xA0236910
CODE16
Main:
ADD R0, R4, #0
SUB R0, #0xB8
LDRB R1, [R0, #0]
CMP R1, #8
BEQ UCS2
CMP R1, #0
BNE Exit
BIT7:  
LDRB R1, [R0, #0xD]
MOV R2, #0x7F
AND R1, R2
MOV R2, #0xF0
B COMP
UCS2:   ;16bit
     LDRB    R3, [R0, #0xD]
LDRB    R1, [R0, #0xE]
     LSL     R3, #8
     ADD     R1, R3      
MOV R2, #0x18
COMP:
     CMP     R1, #0x20
BNE Exit
STRB R2, [R0, #0]
Exit:
ADD     R0, R4, #0
LDR     R1, [R6,#8]
BX LR


; Hook keyhandle of SMS PDU
AREA   HOOK1, CODE, AT 0xA0136910  
CODE16
BL Main


END  [/code]

07.08.2005 в 17:31
avkiev
Исследователь
Признанный телефонист
С нами с: 20.09.2002
Плодовитость: 2088


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Рейтинг

Подано 355 (329/26) голосов
icon Re: Re: Программирование под ARM. Технические вопросы


цитата:
1nvisible пишет: LSL R3, #8
Сдвигает R3 на 8 бит влево, т.е. умножает на 256
08.08.2005 в 06:07
1nvisible
Телефонист
С нами с: 30.06.2005
Плодовитость: 287


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Предупреждения:
ЗамечаниеЗамечание
Рейтинг

Подано 49 (40/9) голосов
icon Re: Программирование под ARM. Технические вопросы


Честно говоря немного не понял. Тогда такой вопрос.
Есть какой-нибудь байт, например 'A7'. Надо узнать сколько в нем "десятков" (ну или применительно к шестнадцатеричной системе счисления - "шестнадцатков" - в данном случае 'A'), а сколько единиц ('7').
Тогда кол-во "десятков" можно узнать командой LSR Rn, #4 или я не прав?
Вообще, в системе команд проца ARM есть сложение, вычитание и умножение. А как быть с делением?
Следующий вопрос. Что делает функция dwMODdw (или DivR1byR0): это целочисленное деление или это операция MOD (т.е. остаток от деления)?
И последний вопрос. В таблице команд напротив каждой есть графа "Версия архитектуры". Какая на x65 версия архитектуры?

08.08.2005 в 15:47
avkiev
Исследователь
Признанный телефонист
С нами с: 20.09.2002
Плодовитость: 2088


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Рейтинг

Подано 355 (329/26) голосов
icon Re: Re: Программирование под ARM. Технические вопросы


Честно говоря немного не понял.
Дак что может быть проще ? Сдвиг регистра влево на 8 бит

Есть какой-нибудь байт, например 'A7'. Надо узнать сколько в нем "десятков" (ну или применительно к шестнадцатеричной системе счисления - "шестнадцатков" - в данном случае 'A'), а сколько единиц ('7').
Сдвинь на 4 вправо - будут шестнадцатки
Сделай AND 0F - будут единицы

А как быть с делением?
Используй dwMODdw

Что делает функция dwMODdw (или DivR1byR0)
Возвращает в R0,R1 целую часть и остаток от деления R1 на R0

Какая на x65 версия архитектуры?
Точно не помню, вроде 9. Не заморачивайся, процессор телефона все поймет

08.08.2005 в 15:57
13.beta2
Начинающий телефонист
В миру: Андрей
Откуда: Россия, Москва
С нами с: 26.04.2003
Плодовитость: 40


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме CX65
Рейтинг

Подано 14 (14/0) голосов
icon Re: Программирование под ARM. Технические вопросы


Наконец-то решил заняться программингом для телефона. Для начала пытаюсь сократить "динамического оператора" до одной единственной функции - вывод строки из памяти. Получилось примерно вот что:
[code]
$arm9e

Inject equ 0x16516D0
Patch equ 0x0800100

$include (..\macro.inc)
$include (..\CX65_50.inc)

; --------------------
align_ 2
Entry:
push {r0, r1, r4, r5, LR}

;ldr r4, [r0]
;add r4, #2
ldr r1, [r0]
add r4, r1, #0
add r4, #2

mov r5, #0
ldr_ 0, Provider
bl strcatW
lsr r5, #1

;sub r4, #2
;strh r5, [r4]
strh r5, [r1]

pop {r0, r1, r4, r5, PC}
strcatW:
push {LR}
ldrh r3, [r0]
strh r3, [r4, r5]
add r0, #2
add r5, #2
cmp r3, #0
bne strcatW + 2
sub r5, #2
pop {PC}
; --------------------
align_ 4
Provider:
offset
dw 'N', 'e', 't', 'w', 'o', 'r', 'k', ' ', 'n', 'a', 'm', 'e', 0
; --------------------
org Inject
dd b1 + Entry
; --------------------
end
[/code]
Не могу понять почему не получается использовать один регистр r4, если он нигде не изменяется ( или я чего-то упускаю из виду )? И ещё:
add r4, r1, #2
заставляет телефон жалобно пискнуть, а
add r4, r1, #0
add r4, #2
прекрасно работает. Разве логически это ни одно и тоже?


____________________________
MT50 -> C62 -> CX65 ( убил делая DCA-540 ) -> CX65

 МегаФон-Москва О'Лайт 

08.08.2005 в 21:54
avkiev
Исследователь
Признанный телефонист
С нами с: 20.09.2002
Плодовитость: 2088


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Рейтинг

Подано 355 (329/26) голосов
icon Re: Re: Программирование под ARM. Технические вопросы


цитата:
почему не получается использовать один регистр r4, если он нигде не изменяется
Не понял вопроса

цитата:
add r4, r1, #2 заставляет телефон жалобно пискнуть
Попробуй после него еще nop дописать. Возможно, ты сбиваешься с границы слова и макросы начинают глючить
09.08.2005 в 09:17
1nvisible
Телефонист
С нами с: 30.06.2005
Плодовитость: 287


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Предупреждения:
ЗамечаниеЗамечание
Рейтинг

Подано 49 (40/9) голосов
icon Re: Программирование под ARM. Технические вопросы


2 13.beta2:
100% глючит LoadReg. Когда я делал свой патч, тоже часто недоумевал, т.к. вводил функцию, на которую ВООБЩЕ нет ссылок (чисто ради эксперимента), а тел вырубался с Prefetch Abort'ом.
Без нее же все пахало. Потом случайно посмотрел все в IDA и увидел, что LDR работает неверно (не дотягивается на 2 байта). NOP'ы кажется тоже не помогают...
А насчет регистра я тоже ничего не понял...

10.08.2005 в 13:57
13.beta2
Начинающий телефонист
В миру: Андрей
Откуда: Россия, Москва
С нами с: 26.04.2003
Плодовитость: 40


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме CX65
Рейтинг

Подано 14 (14/0) голосов
icon Re: Программирование под ARM. Технические вопросы


Пасибо за ответы, вроде разобрался. Как оказалось проблема в обоих случая была всё-таки в выравнивании. Пришлось написать макрос:
adr_ macro reg, val
$if((val-$) & 3)
nop
$endif

;$if(val > $)
add reg, PC, #(val-$-4)
;$else
; sub reg, PC, #($-val)
;$endif
endm
То есть загружаем адрес переменной сразу в регистр, если чего - подравниваем. Но вот облом, никак я не могу заставить препроцессор просчитать где находится переменная, до текущего адреса или после. Извращался всеми способами которые смог придумать - бесполезно. Поэтому вопрос первый: есть ли шансы или забить, раз итак тоже работает?
Вопрос второй: существует ли соглашение о передаче параметров или у каждой функции свои требования? И ещё как это связано с сохранением регистров ( например означает ли push {R0-R7, LR} отсутствие параметров )?
Кстати, а где можно узнать что есть Prefetch_Abort, что Data_Abort и т.д.?

Извиняюсь за столько вопросов сразу, но темой хочется овладеть за минимальные сроки ибо и любопытство и учёба скоро
А LoadReg наверное глючил, это да. Я его сразу переделал на:
ldr_ macro reg, val
db (reg << 8) | (val-$)/4
db 0x48
endm
имхо так немного надёжнее будет


____________________________
MT50 -> C62 -> CX65 ( убил делая DCA-540 ) -> CX65

 МегаФон-Москва О'Лайт 

10.08.2005 в 22:53
avkiev
Исследователь
Признанный телефонист
С нами с: 20.09.2002
Плодовитость: 2088


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Рейтинг

Подано 355 (329/26) голосов
icon Re: Re: Программирование под ARM. Технические вопросы


цитата:
1nvisible пишет: 100% глючит LoadReg
Можешь привести конкретный пример когда он глючит ? По какому адресу должен вызываться LoadReg и куда он должен тянуться чтобы отрабатывать неверно ?
Я этот макрос использую во всех своих патчах, проблем никогда не было, никогда не обращаю внимание - нахожусь ли я на границе слова или нет...
11.08.2005 в 06:10
avkiev
Исследователь
Признанный телефонист
С нами с: 20.09.2002
Плодовитость: 2088


Просмотр досье Отправить письмо Оставить личное сообщениеСейчас нет на форуме
Рейтинг

Подано 355 (329/26) голосов
icon Re: Re: Программирование под ARM. Технические вопросы


цитата:
никак я не могу заставить препроцессор просчитать где находится переменная, до текущего адреса или после
Так а If/Else/Endif - не работают ?

цитата:
существует ли соглашение о передаче параметров или у каждой функции свои требования? И ещё как это связано с сохранением регистров ( например означает ли push {R0-R7, LR} отсутствие параметров )?
Параметры обычно передаются начиная с R0. Т.е. для передачи 4-х параметров используются R0-R3. Для передачи большего числа параметров используется стек (смотри например sprintf).
Обычно функция не забудится о сохранении аргументов, этим занимается вызывающая функция. Все, конечно, зависит от конкретного случая, но push {R0-R7, LR} с достаточно большой вероятностью говорит об отсутствии параметров

цитата:
где можно узнать что есть Prefetch_Abort, что Data_Abort и т.д.?
В документации

цитата:
db (reg << 8) | (val-$)/4
Попробуй так: (val-$-2)/4
11.08.2005 в 06:23
 SC-форум : Hard&Soft : Программирование под ARM. Технические вопросы

Навигация:
Не авторизировались?
Имя (Ник):  Пароль:  Забыли пароль?




Администрация Клуба. Разработка: BigVovch