Из С# на asm

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
panya
Открыл глаза
Сообщения: 42
Зарегистрирован: Сб ноя 29, 2014 21:20:52

Из С# на asm

Сообщение panya »

:))
ковыряю исходник прошивки (на asm'е) - а в нем не мяу-мяу. :cry:
контроллер: 80c196kc, без внутренней ПЗУ и регистровой памятью 488байт
Если не жалко дайте пару советов/ответов.
Вопрос:

1.

Код: Выделить всё

ROM:2080                 di
ROM:2081                 dpts
ROM:2082                 ld      SP, #1E6h      
ROM:2086                 ld      INTMEM_1B+1, #0
ROM:208A                 ld      INTMEM_1E, #22h 
ROM:208E                 ld      INTMEM_20, #0EFh
ROM:2092
ROM:2092 ROM_2092:                              
ROM:2092                 st      INTMEM_1B+1, [INTMEM_1E]+
ROM:2095                 djnzw   INTMEM_20, ROM_2092
ROM:2098                 lcall   ROM_A000
ROM:209B                 rst
здесь прогрузилось число 1E6h в указатель стека (но зачем?), потом в переменную INTMEM_1B+1 ноль, а зачем там +1, он смещает адрес на 1 байт?

и 2.

Код: Выделить всё

 ldb     INTMEM_7F, (INTMEM_32A+1)[]
 ld      INTMEM_54, #-748Eh
интересует конструкция в круглых скобках, (INTMEM_32A+1) что они делают (скобки). я так понимаю там загрузка байта с INTMEM_32A так зачем там скобки и +1?
и смущает ld INTMEM_54, #-748Eh - это что прогрузка отрицательного числа?

спасибо )
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Из С# на asm

Сообщение BOB51 »

Синтаксис компилятора знать нажобно... а оного нету (вернее хелпа к неведомому компилятору).
имя+n применяется в большинстве компиляторов для указания смещения в массиве с именем
т.е. указав INTMEM_1B+1 мы определяем следующую за INTMEM_1B ячейку (некоторая экономия в перечне имен для величин, относящихся к одному подвиду).
st INTMEM_1B+1, [INTMEM_1E]+
похоже может звучать как
загрузить ячейку INTMEM_1B+1 из ячейки, указатель которой находится в INTMEM_1E с (последующим) инкрементом содержимого INTMEM_1E

#-748Eh скорее всего действительно отрицательное...
а вот куды отнести
ldb INTMEM_7F, (INTMEM_32A+1)[]
квадратны скобки за (INTMEM_32A+1) - это только хелп по компилятору подскажет. :dont_know:
Реклама
panya
Открыл глаза
Сообщения: 42
Зарегистрирован: Сб ноя 29, 2014 21:20:52

Re: Из С# на asm

Сообщение panya »

BOB51 писал(а):Синтаксис компилятора знать нажобно... а оного нету (вернее хелпа к неведомому компилятору).
имя+n применяется в большинстве компиляторов для указания смещения в массиве с именем
т.е. указав INTMEM_1B+1 мы определяем следующую за INTMEM_1B ячейку (некоторая экономия в перечне имен для величин, относящихся к одному подвиду).
st INTMEM_1B+1, [INTMEM_1E]+
похоже может звучать как
загрузить ячейку INTMEM_1B+1 из ячейки, указатель которой находится в INTMEM_1E с (последующим) инкрементом содержимого INTMEM_1E

#-748Eh скорее всего действительно отрицательное...
а вот куды отнести
ldb INTMEM_7F, (INTMEM_32A+1)[]
квадратны скобки за (INTMEM_32A+1) - это только хелп по компилятору подскажет. :dont_know:
спасибо :beer:
Rtmip
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

Re: Из С# на asm

Сообщение Rtmip »

panya писал(а):...ковыряю исходник прошивки (на asm'е)...контроллер: 80c196kc...
А при чем тут тогда "Из С# на asm"? Или вы имеете ввиду ассемблерный листинг, полученный из "С",
или это листинг какого-то дизассемблера, что больше похоже на правду?
panya писал(а):...Вопрос:
здесь прогрузилось число 1E6h в указатель стека (но зачем?...
Это чтобы стек инициализировать, а он вниз тут вроде растет..
panya писал(а):...потом в переменную INTMEM_1B+1 ноль, а зачем там +1, он смещает адрес на 1 байт?...
Почти, икремент байта в данном случае, вроде.
В итоге, мне думается, что эта часть кода:

Код: Выделить всё

ROM:2086                 ld      INTMEM_1B+1, #0
ROM:208A                 ld      INTMEM_1E, #22h 
ROM:208E                 ld      INTMEM_20, #0EFh
ROM:2092
ROM:2092 ROM_2092:                              
ROM:2092                 st      INTMEM_1B+1, [INTMEM_1E]+
ROM:2095                 djnzw   INTMEM_20, ROM_2092
просто выполняет начальную инициализацию - заполняет нулями область регистров от 0 до 0хFF.
panya писал(а):...и 2.

Код: Выделить всё

 ldb     INTMEM_7F, (INTMEM_32A+1)[]
 ld      INTMEM_54, #-748Eh
интересует конструкция в круглых скобках, (INTMEM_32A+1) что они делают (скобки). я так понимаю там загрузка байта с INTMEM_32A так зачем там скобки и +1?...
это загрузка байта из регистра INTMEM_32A+1 по адресу INTMEM_7F, вроде так, для точного ответа
надо изучать даташит внимательно, но неохота, нет у меня таких МК... Если где ошибся, извините.
panya писал(а):...и смущает ld INTMEM_54, #-748Eh - это что прогрузка отрицательного числа?
можно считать, что так, а можно и так: 0x0 - 748Eh = 8B72h :))
Реклама
Эиком - электронные компоненты и радиодетали
panya
Открыл глаза
Сообщения: 42
Зарегистрирован: Сб ноя 29, 2014 21:20:52

Re: Из С# на asm

Сообщение panya »

Rtmip писал(а):...это листинг какого-то дизассемблера, что больше похоже на правду?
Да. код получен из IDA pro, а изначально это bin
Rtmip писал(а): просто выполняет начальную инициализацию - заполняет нулями область регистров от 0 до 0хFF
Забивает нулями переменные с 22h по 22h+EFh :)
Rtmip писал(а): это загрузка байта из регистра INTMEM_32A+1 по адресу INTMEM_7F, вроде так, для точного ответа
надо изучать даташит внимательно, но неохота, нет у меня таких МК... Если где ошибся, извините.
Даташита нету (есть в сети о том какое питание давать, и где ножки, а вот какие биты выставлять для включения периферии и остальной гадости нету :( ), есть неполная инструкция на русском от 1997 года, благо в конце есть система команд для МК.

Я был бы рад, если INTMEM_32A+1 был регистром или переменной, но при переходе на него:

Код: Выделить всё

INTMEM:032A INTMEM_32A:                             ; DATA XREF: ROM_29DE+65r
INTMEM:032A                                         ; ROM_A76Fr ...
INTMEM:032A                 ld      INTMEM_1B+1, (ROM_8CC3+3)[]
а по ROM_8CC3+3

Код: Выделить всё

ROM:8CC3 ROM_8CC3:                               ; DATA XREF: ROM_9205+32Cw
ROM:8CC3                                         ; ROM_FCCE+5Fr ...
ROM:8CC3                 stb     INTMEM_1B+1, (ROM_7BFE+2)[]
а по ROM_7BFE+2

Код: Выделить всё

ROM_7BFE:                               ; DATA XREF: INTMEM:INTMEM_38Cr
ROM:7BFE                                         ; INTMEM:03B5w ...
ROM:7BFE                 stb     INTMEM_1B+1, (ROM_8B60+1)[]
а по ROM_8B60+1

Код: Выделить всё

ROM:8B60 ROM_8B60:                               ; DATA XREF: ROM_15A8+13r
ROM:8B60                                         ; ROM_15A8:ROM_16A1r ...
ROM:8B60                 cmpb    INTMEM_1B+1, #6
печально как-то....Нето мы через десяток переходов шли к десятичкой шестёрке, нето что-то другое там....
Дело в том что этот МК разговаривает с другими МК и внешней памятью. И иногда еще во внешнюю память что-то пишет.

Вроде как нашел кусок где он что-то там пишет :

Код: Выделить всё

ROM:A8FC ROM_A8FC:                               ; CODE XREF: ROM_A000+6p
ROM:A8FC                 clrb    WSR             ; Window selection register
ROM:A8FE                 clrb    WSR1            ; Window selection register 1
ROM:A900                 ldb     INTMEM_16, #62h ; 'b'
ROM:A903                 ldb     INTMEM_A+1, #-40h ; 'L'
ROM:A906                 ldb     INTMEM_E, #1
ROM:A909                 ldb     INTMEM_E, #-80h ; 'А'
ROM:A90C                 ldb     IOPORT2+1, #0Bh ; Input/output port 2
ROM:A90F                 ldb     INTMEM_78, IOPORT2+1 ; Input/output port 2
ROM:A912                 orb     INTMEM_76+1, #1
ROM:A915                 ldb     INT_MASK, #-60h ; 'а' ; Interrupt mask register
ROM:A918                 clrb    INT_PEND        ; Interrupt pending register
ROM:A91A                 ldb     INT_MASK1, #20h ; ' ' ; Interrupt mask register 1
ROM:A91D                 clrb    INT_PEND1       ; Interrupt pending register 1
ROM:A91F                 ldb     WSR, #1         ; Window selection register
ROM:A922                 ldb     INTMEM_C, #1
ROM:A925                 clrb    WSR             ; Window selection register
ROM:A927                 ldb     IOPORT1, #0Bh   ; Input/output port 1
ROM:A92A                 ldb     IOPORT2, #5Fh ; '_' ; Input/output port 2
ROM:A92D                 ldb     WSR, #0Fh       ; Window selection register
ROM:A930                 ldb     WSR1, #20h ; ' ' ; Window selection register 1
ROM:A933                 clrb    WSR             ; Window selection register
ROM:A935                 ldb     INTMEM_6, #18h
ROM:A938                 add     INTMEM_4, INTMEM_A, #1D4Ch
ROM:A93D                 ldb     INTMEM_6, #19h
ROM:A940                 add     INTMEM_4, INTMEM_A, (ROM_8BC0+4)[]
ROM:A946                 lcall   ROM_40C
ROM:A949                 push    #14h
ROM:A94C                 scall   ROM_AB13
ROM:A94E                 add     SP, #2          ; Stack pointer
ROM:A952                 ldb     INTMEM_1B+1, #-7Dh ; 'Г'
ROM:A955                 stb     INTMEM_1B+1, ROM_7C03[]
ROM:A95A                 ldb     INTMEM_1B+1, #40h ; '@'
ROM:A95D                 stb     INTMEM_1B+1, (ROM_7BFE+2)[]
ROM:A962                 stb     INTMEM_1B+1, (ROM_7BFE+4)[]
ROM:A967                 ldb     INTMEM_1B+1, #-75h ; 'Л'
ROM:A96A                 stb     INTMEM_1B+1, (ROM_7B01+2)[]
ROM:A96F                 clrb    INTMEM_1B+1
ROM:A971                 stb     INTMEM_1B+1, (ROM_7AFF+1)[]
ROM:A976                 ldb     INTMEM_1B+1, #1Ah
ROM:A979                 stb     INTMEM_1B+1, (ROM_7CFE+4)[]
ROM:A97E                 ldb     INTMEM_1B+1, #3
ROM:A981                 stb     INTMEM_1B+1, (ROM_7CFE+2)[]
ROM:A986                 ldb     INTMEM_1B+1, #7
ROM:A989                 stb     INTMEM_1B+1, (ROM_7CFE+2)[]
ROM:A98E                 ldb     INTMEM_1B+1, #-45h ; '¬'
ROM:A991                 stb     INTMEM_1B+1, (ROM_7CFE+3)[]
ROM:A996                 ldb     INTMEM_1B+1, #5
ROM:A999                 stb     INTMEM_1B+1, (ROM_7CFE+4)[]
ROM:A99E                 ldb     INTMEM_1B+1, #1Ah
ROM:A9A1                 stb     INTMEM_1B+1, (ROM_7D08+2)[]
ROM:A9A6                 ldb     INTMEM_1B+1, #3
ROM:A9A9                 stb     INTMEM_1B+1, ROM_7D08[]
ROM:A9AE                 ldb     INTMEM_1B+1, #7
ROM:A9B1                 stb     INTMEM_1B+1, ROM_7D08[]
ROM:A9B6                 ldb     INTMEM_1B+1, #-45h ; '¬'
ROM:A9B9                 stb     INTMEM_1B+1, (ROM_7D08+1)[]
ROM:A9BE                 ldb     INTMEM_1B+1, #5
ROM:A9C1                 stb     INTMEM_1B+1, (ROM_7D08+2)[]
ROM:A9C6                 ldb     INTMEM_75, #22h ; '"'
ROM:A9C9                 stb     INTMEM_75, ROM_7D05[]
ROM:A9CE                 clrb    INTMEM_1B+1
ROM:A9D0                 stb     INTMEM_1B+1, ROM_9B83[]
ROM:A9D5                 ldb     INTMEM_1B+1, #0Ah
ROM:A9D8                 stb     INTMEM_1B+1, ROM_7D0D[]
ROM:A9DD                 ldb     INTMEM_1B+1, #1
ROM:A9E0                 stb     INTMEM_1B+1, (ROM_7D0D+2)[]
ROM:A9E5                 ldb     INTMEM_1B+1, #-0Eh ; 'Є'
ROM:A9E8                 stb     INTMEM_1B+1, (ROM_7D0D+1)[]
ROM:A9ED                 ldb     INTMEM_1B+1, #1
ROM:A9F0                 stb     INTMEM_1B+1, ROM_7E0E[]
ROM:A9F5                 ldb     INTMEM_1B+1, #1Ah
ROM:A9F8                 stb     INTMEM_1B+1, (ROM_7E00+2)[]
ROM:A9FD                 ldb     INTMEM_1B+1, #3
ROM:AA00                 stb     INTMEM_1B+1, ROM_7E00[]
ROM:AA05                 ldb     INTMEM_1B+1, #7
ROM:AA08                 stb     INTMEM_1B+1, ROM_7E00[]
ROM:AA0D                 ldb     INTMEM_1B+1, #-45h ; '¬'
ROM:AA10                 stb     INTMEM_1B+1, (ROM_7E00+1)[]
ROM:AA15                 ldb     INTMEM_1B+1, #5
ROM:AA18                 stb     INTMEM_1B+1, (ROM_7E00+2)[]
ROM:AA1D                 ldb     INTMEM_1B+1, #1Ah
ROM:AA20                 stb     INTMEM_1B+1, (ROM_7E08+2)[]
ROM:AA25                 ldb     INTMEM_1B+1, #13h
ROM:AA28                 stb     INTMEM_1B+1, ROM_7E08[]
ROM:AA2D                 ldb     INTMEM_1B+1, #7
ROM:AA30                 stb     INTMEM_1B+1, ROM_7E08[]
ROM:AA35                 ldb     INTMEM_1B+1, #-23h ; '¦'
ROM:AA38                 stb     INTMEM_1B+1, (ROM_7E08+1)[]
ROM:AA3D                 ldb     INTMEM_1B+1, #64h ; 'd'
ROM:AA40                 stb     INTMEM_1B+1, (ROM_7E00+4)[]
ROM:AA45                 clrb    INTMEM_1B+1
ROM:AA47                 stb     INTMEM_1B+1, (ROM_7E05+1)[]
ROM:AA4C                 ldb     INTMEM_1B+1, #9
ROM:AA4F                 stb     INTMEM_1B+1, (ROM_7E05+2)[]
ROM:AA54                 ldb     INTMEM_1B+1, #5
ROM:AA57                 stb     INTMEM_1B+1, (ROM_7E08+2)[]
ROM:AA5C                 ldb     INTMEM_1B+1, #0Ah
ROM:AA5F                 stb     INTMEM_1B+1, (ROM_7E0C+1)[]
ROM:AA64                 ldb     INTMEM_1B+1, #-40h ; 'L'
ROM:AA67                 stb     INTMEM_1B+1, ROM_7E0F[]
ROM:AA6C                 ldb     INTMEM_1B+1, #30h ; '0'
ROM:AA6F                 stb     INTMEM_1B+1, ROM_7E0E[]
ROM:AA74                 ldb     INTMEM_1B+1, #2
ROM:AA77                 stb     INTMEM_1B+1, (ROM_9B83+1)[]
ROM:AA7C                 stb     INTMEM_1B+1, ROM_7E05[]
ROM:AA81                 clrb    INTMEM_1B+1
ROM:AA83                 stb     INTMEM_1B+1, (ROM_9B7F+2)[]
ROM:AA88                 stb     INTMEM_1B+1, (ROM_9B7F+3)[]
ROM:AA8D                 ret
ROM:AA8D ; End of function ROM_A8FC
ROM:AA8D
ROM:AA8E
ROM:AA8E ; =============== S U B R O U T I N E =====================
ROM:AA8E
и там опять круглые скобки...может весь прикол в них????

stb - отправляет байт из левого операнда в правый (операнд приёмник)
Реклама
Шурики
Вымогатель припоя
Сообщения: 506
Зарегистрирован: Пн авг 31, 2009 22:10:50
Откуда: СК

Re: Из С# на asm

Сообщение Шурики »

panya писал(а):Даташита нету ...
Если это поможет


https://yadi.sk/d/yvK6O94innPh5

Там ещё много чего.
Реклама
Ответить

Вернуться в «Разные вопросы по МК»