Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » сравнение строковых переменных, вопрос к знатокам Ассемблера


сравнение строковых переменных, вопрос к знатокам Ассемблера

Сообщений 1 страница 5 из 5

1

Доброго всем дня

вопрос такой: как Баском сравнивает строковые переменные одной длины? посимвольно?
может кто-то посмотреть сгенерированный код, а то моих скоромных знаний ассма не хватило, чтобы всё это понять...

0

2

Bascom

$map              ' Получаем карту распределения памяти
  $regfile = "m328pdef.dat"       ' Используемый контроллер
  $crystal = 1000000       ' 1 МГц
'  $crystal = 8000000       ' 8 МГц
  $framesize = 32   'размер области используемой и необходимой для преобразований
  $hwstack = 40     ' Размер аппаратного стека
  $swstack = 16     ' Размер программного стека

  Dim Переменная_str_1 As String * 10
  Dim Переменная_str_2 As String * 10
  Dim Переменная_str_3 As String * 10

  Переменная_str_1 = "1234567890"
  Переменная_str_2 = "0987654321"
  Переменная_str_3 = "1234567890"

'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
'===============================================================================
  Главный_цикл:
    nop

    If Переменная_str_1 = Переменная_str_2 Then
    End If

    If Переменная_str_1 = Переменная_str_3 Then
    End If

    nop
  Goto Главный_цикл
End
'===============================================================================
'                        П О Д П Р О Г Р А М М Ы
'===============================================================================

Дизассемблер

0000 940C     JMP  $0068
0004 9518     RETI
0006 0000     NOP
0008 9518     RETI
000A 0000     NOP
000C 9518     RETI
000E 0000     NOP
0010 9518     RETI
0012 0000     NOP
0014 9518     RETI
0016 0000     NOP
0018 9518     RETI
001A 0000     NOP
001C 9518     RETI
001E 0000     NOP
0020 9518     RETI
0022 0000     NOP
0024 9518     RETI
0026 0000     NOP
0028 9518     RETI
002A 0000     NOP
002C 9518     RETI
002E 0000     NOP
0030 9518     RETI
0032 0000     NOP
0034 9518     RETI
0036 0000     NOP
0038 9518     RETI
003A 0000     NOP
003C 9518     RETI
003E 0000     NOP
0040 9518     RETI
0042 0000     NOP
0044 9518     RETI
0046 0000     NOP
0048 9518     RETI
004A 0000     NOP
004C 9518     RETI
004E 0000     NOP
0050 9518     RETI
0052 0000     NOP
0054 9518     RETI
0056 0000     NOP
0058 9518     RETI
005A 0000     NOP
005C 9518     RETI
005E 0000     NOP
0060 9518     RETI
0062 0000     NOP
0064 9518     RETI
0066 0000     NOP
0068 EF8F     SER  R24
006A BF8D     OUT  $3D, R24
006C EDC8     LDI  R28, $D8
006E ECE0     LDI  R30, $C0
0070 2E4E     MOV  R4, R30
0072 E088     LDI  R24, $08
0074 BF8E     OUT  $3E, R24
0076 E0D8     LDI  R29, $08
0078 E0F8     LDI  R31, $08
007A 2E5F     MOV  R5, R31
007C 95A8     WDR
007E B784     IN   R24, $34
0080 2E08     MOV  R0, R24
0082 7F87     ANDI R24, $F7
0084 BF84     OUT  $34, R24
0086 E188     LDI  R24, $18
0088 2799     EOR  R25, R25
008A 9380     STS  $0060, R24
008E 9390     STS  $0060, R25
0092 EFEE     LDI  R30, $FE
0094 E0F7     LDI  R31, $07
0096 E0A0     LDI  R26, $00
0098 E0B1     LDI  R27, $01
009A 2788     EOR  R24, R24
009C 938D     ST   X+, R24
009E 9731     SBIW R31:R30, 1
00A0 F7E9     BRNE $009C
00A2 2466     EOR  R6, R6
             
                $map              ' Получаем карту распределения памяти
                $regfile = "m328pdef.dat"       ' Используемый контроллер
                $crystal = 1000000       ' 1 МГц
              '  $crystal = 8000000       ' 8 МГц
                $framesize = 32   'размер области используемой и необходимой для преобразований
                $hwstack = 40     ' Размер аппаратного стека
                $swstack = 16     ' Размер программного стека
             
             
                Dim Переменная_str_1 As String * 10
                Dim Переменная_str_2 As String * 10
                Dim Переменная_str_3 As String * 10
             
                Переменная_str_1 = "1234567890"
00A4 E0A0     LDI  R26, $00
00A6 E0B1     LDI  R27, $01
00A8 E4E6     LDI  R30, $46
00AA E0F1     LDI  R31, $01
00AC 940E     CALL $010A
                Переменная_str_2 = "0987654321"
00B0 E0AB     LDI  R26, $0B
00B2 E0B1     LDI  R27, $01
00B4 E5E2     LDI  R30, $52
00B6 E0F1     LDI  R31, $01
00B8 940E     CALL $010A
                Переменная_str_3 = "1234567890"
00BC E1A6     LDI  R26, $16
00BE E0B1     LDI  R27, $01
00C0 E4E6     LDI  R30, $46
00C2 E0F1     LDI  R31, $01
00C4 940E     CALL $010A
             
              '===============================================================================
              '                   Г Л А В Н Ы Й         Ц И К Л
              '===============================================================================
                Главный_цикл:
                  nop
00C8 0000     NOP
             
             
                  If Переменная_str_1 = Переменная_str_2 Then
00CA E0EB     LDI  R30, $0B
00CC E0F1     LDI  R31, $01
00CE E0A0     LDI  R26, $00
00D0 E0B1     LDI  R27, $01
00D2 940E     CALL $0122
00D6 F011     BRBS 1, $00DC
00D8 940C     JMP  $00DC
                  End If
             
             
                  If Переменная_str_1 = Переменная_str_3 Then
00DC E1E6     LDI  R30, $16
00DE E0F1     LDI  R31, $01
00E0 E0A0     LDI  R26, $00
00E2 E0B1     LDI  R27, $01
00E4 940E     CALL $0122
00E8 F011     BRBS 1, $00EE
00EA 940C     JMP  $00EE
                  End If
             
             
             
                  nop
00EE 0000     NOP
                Goto Главный_цикл
00F0 940C     JMP  $00C8
               End
00F4 94F8     BCLR 7
00F6 CFFF     RJMP $-0000 (00F6)
              '===============================================================================
              '                        П О Д П Р О Г Р А М М Ы
              '===============================================================================
00F8 9731     SBIW R31:R30, 1
00FA F7F1     BRNE $00F8
00FC 9508     RET
00FE 9468     SET
0100 F862     BLD  R6, 2
0102 9508     RET
0104 94E8     BCLR 6
0106 F862     BLD  R6, 2
0108 9508     RET
010A 940E     CALL $0116
010E 920D     ST   X+, R0
0110 2000     AND  R0, R0
0112 F7D9     BRNE $010A
0114 9508     RET
0116 95C8     LPM
0118 9631     ADIW R31:R30, 1
011A 2000     AND  R0, R0
011C 9508     RET
011E 9468     SET
0120 C001     RJMP $+0004 (0124)
0122 94E8     BCLR 6
0124 93AF     PUSH R26
0126 93BF     PUSH R27
0128 918D     LD   R24, X+
012A F016     BRBS 6, $0130
012C 9191     LD   R25, Z+
012E C003     RJMP $+0008 (0136)
0130 940E     CALL $0116
0134 2D90     MOV  R25, R0
0136 1789     CP   R24, R25
0138 F018     BRLO $0140
013A F411     BRNE $0140
013C 2388     AND  R24, R24
013E F7A1     BRNE $0128
0140 91BF     POP  R27
0142 91AF     POP  R26
0144 9508     RET
0146 3231     CPI  R19, $21
0148 3433     CPI  R19, $43
014A 3635     CPI  R19, $65
014C 3837     CPI  R19, $87
014E 3039     CPI  R19, $09
0150 0000     NOP
0152 3930     CPI  R19, $90
0154 3738     CPI  R19, $78
0156 3536     CPI  R19, $56
0158 3334     CPI  R19, $34
015A 3132     CPI  R19, $12
015C 0000     NOP

0

3

Александр Д. написал(а):

Доброго всем дня

вопрос такой: как Баском сравнивает строковые переменные одной длины? посимвольно?
может кто-то посмотреть сгенерированный код, а то моих скоромных знаний ассма не хватило, чтобы всё это понять...

В чем собственно вопрос? Сравниваются конечно не символы, а байты. Байты сравниваются если равно, то до первого не неравного.

0

4

просто сам алгоритм интересен, как они его там конвертируют. Просто иногда пишу своё, и оно компактнее, чем в типовых командах Баскома
особенно это касается неявного преобразования типов

0

5

Ничего не конвертируют. В памяти символ это байт, строка в памяти хоть программ, хоть оперативки выглядит как набор байт, это редактор их показывает символами.  A="Привет" в памяти будет CF F0 E8 E2 E5 F2 Признак окончания нулевой байт "00"
Строку можно читать как массив байт или как массив символов.

Отредактировано IgorL (2014-03-21 09:52:08)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » сравнение строковых переменных, вопрос к знатокам Ассемблера