У кейл 51 проблемы с указателями на неизвестный тип памяти
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Al Volovich 04 июля 2003 г. 14:57
В ответ на: Ответ: отправлено _Elektronik_ 04 июля 2003 г. 10:55

Если ему помочь, то будет так:
Для данных во встроеном ОЗУ
1 char data *strtrm(char data *ptr) {
2 1 char data *_pt = ptr;
3 1 char _ch;
4 1 while (*_pt++); // Find the string end
5 1 --_pt; // Adjust pointer
6 1 while (_pt > ptr) // Go to the sring start
7 1 {
8 2
9 2 _ch = *--_pt; // Get byte
10 2 if (_ch!=' ' && _ch!='\t') // It's not a space or tab
11 2 break; // then all done
12 2 }
13 1 *(_pt+1) = 0; // Terminate the string
14 1 return ptr;
15 1 }
C51 COMPILER V7.04 TTT 07/04/2003 16:51:10 PAGE 2

ASSEMBLY LISTING OF GENERATED OBJECT CODE

; FUNCTION _strtrm (BEGIN)
; SOURCE LINE # 1
;---- Variable '_ch' assigned to Register 'R6' ----
;---- Variable 'ptr' assigned to Register 'R7' ----
; SOURCE LINE # 2
;---- Variable '_pt' assigned to Register 'R5' ----
0000 AD07 MOV R5,AR7
0002 ?C0001:
; SOURCE LINE # 4
0002 AC05 MOV R4,AR5
0004 0D INC R5
0005 A804 MOV R0,AR4
0007 E6 MOV A,@R0
0008 70F8 JNZ ?C0001
000A ?C0002:
; SOURCE LINE # 5
000A 1D DEC R5
000B ?C0003:
; SOURCE LINE # 6
000B ED MOV A,R5
000C D3 SETB C
000D 9F SUBB A,R7
000E 400E JC ?C0004
; SOURCE LINE # 7
; SOURCE LINE # 9
0010 1D DEC R5
0011 A805 MOV R0,AR5
0013 E6 MOV A,@R0
0014 FE MOV R6,A
; SOURCE LINE # 10
0015 6420 XRL A,#020H
0017 60F2 JZ ?C0003
0019 EE MOV A,R6
001A 6409 XRL A,#09H
001C 60ED JZ ?C0003
; SOURCE LINE # 11
; SOURCE LINE # 12
001E ?C0004:
; SOURCE LINE # 13
001E ED MOV A,R5
001F 04 INC A
0020 F8 MOV R0,A
0021 E4 CLR A
0022 F6 MOV @R0,A
; SOURCE LINE # 14
; SOURCE LINE # 15
0023 ?C0006:
0023 22 RET
; FUNCTION _strtrm (END)

MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 36 ----

А для данных во внешней памяти:
1 char xdata *strtrm(char xdata *ptr) {
2 1 char xdata *_pt = ptr;
3 1 char _ch;
4 1 while (*_pt++); // Find the string end
5 1 --_pt; // Adjust pointer
6 1 while (_pt > ptr) // Go to the sring start
7 1 {
8 2
9 2 _ch = *--_pt; // Get byte
10 2 if (_ch!=' ' && _ch!='\t') // It's not a space or tab
11 2 break; // then all done
12 2 }
13 1 *(_pt+1) = 0; // Terminate the string
14 1 return ptr;
15 1 }
C51 COMPILER V7.04 TTT 07/04/2003 16:55:24 PAGE 2

ASSEMBLY LISTING OF GENERATED OBJECT CODE


; FUNCTION _strtrm (BEGIN)
; SOURCE LINE # 1
;---- Variable '_ch' assigned to Register 'R1' ----
;---- Variable 'ptr' assigned to Register 'R6/R7' ----
; SOURCE LINE # 2
;---- Variable '_pt' assigned to Register 'R4/R5' ----
0000 AD07 MOV R5,AR7
0002 AC06 MOV R4,AR6
0004 ?C0001:
; SOURCE LINE # 4
0004 0D INC R5
0005 ED MOV A,R5
0006 AA04 MOV R2,AR4
0008 7001 JNZ ?C0007
000A 0C INC R4
000B ?C0007:
000B 14 DEC A
000C F582 MOV DPL,A
000E 8A83 MOV DPH,R2
0010 E0 MOVX A,@DPTR
0011 70F1 JNZ ?C0001
0013 ?C0002:
; SOURCE LINE # 5
0013 ED MOV A,R5
0014 1D DEC R5
0015 7001 JNZ ?C0008
0017 1C DEC R4
0018 ?C0008:
0018 ?C0003:
; SOURCE LINE # 6
0018 D3 SETB C
0019 ED MOV A,R5
001A 9F SUBB A,R7
001B EC MOV A,R4
001C 9E SUBB A,R6
001D 4015 JC ?C0004
; SOURCE LINE # 7
; SOURCE LINE # 9
001F ED MOV A,R5
0020 1D DEC R5
0021 7001 JNZ ?C0009
0023 1C DEC R4
0024 ?C0009:
0024 14 DEC A
0025 F582 MOV DPL,A
0027 8C83 MOV DPH,R4
0029 E0 MOVX A,@DPTR
002A F9 MOV R1,A
; SOURCE LINE # 10
002B 6420 XRL A,#020H
002D 60E9 JZ ?C0003
002F E9 MOV A,R1
0030 6409 XRL A,#09H
0032 60E4 JZ ?C0003
; SOURCE LINE # 11
; SOURCE LINE # 12
0034 ?C0004:
; SOURCE LINE # 13
0034 8D82 MOV DPL,R5
C51 COMPILER V7.04 TTT 07/04/2003 16:55:24 PAGE 3

0036 8C83 MOV DPH,R4
0038 A3 INC DPTR
0039 E4 CLR A
003A F0 MOVX @DPTR,A
; SOURCE LINE # 14
; SOURCE LINE # 15
003B ?C0006:
003B 22 RET
; FUNCTION _strtrm (END)

MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 60 ----


Получается намного короче, чем с 3-х байтными указателями. Неизвестно зачем кейл по умолчанию адресует 16М.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru