а стандарты.. это наше всё..
@hobbyelectronics
Мне по необходимости приходилось расковыривать НЕХ от бейсика и от си. Если сишный компилятор еще более менее компактно создает, хотя и с избыточностью, то бейсик формирует полный бред вообще. Работоспособный, но не более.Мурик писал(а):Если это реализовывать на бейске FastAVR, то HEX получится еще компактнее чем на Си!
Код: Выделить всё
for (i=0; i<8; i++)
{
if (byte & (1<<i))
{
//единица в текущем бите
}
else
{
//ноль в текущем бите
}
}
Код: Выделить всё
mov #8,R15
bitsend_loop:
rra.b R12//тут байт
jc send_1
jnc send_0
continue_bitsend:
dec R15
jnz bitsend_loop
jmp bitsend_compl
send_0:
//ноль в текущем бите
jmp continue_bitsend
send_1:
//единица в текущем бите
jmp continue_bitsend
bitsend_compl:
...
OK.eufs писал(а):Если сишный компилятор еще более менее компактно создает, хотя и с избыточностью, то бейсик формирует полный бред вообще.
Код: Выделить всё
$Device= 2313
$Stack = 32
$Clock = 3.6864
$Lcd = PORTD.4, RS=PORTB.4, EN=PORTB.5, 16, 4
$1Wire = PORTD.3
$Source= On
Dim T As Word
Dim d0 As Byte, d1 As Byte, d2 As Byte, d3 As Byte
Dim d4 As Byte, d5 As Byte, d6 As Byte, d7 As Byte
Dim crc As Byte
Declare Sub Read1820()
Declare Sub CalcTmp()
Lcd "DS1820 T="
Do
If 1Wreset Then
1Wwrite &hcc; &h44
WaitMs 250
1Wreset
1Wwrite &hcc; &hbe
Read1820()
Else
Locate 1,10: Lcd "---"
End If
WaitMs 200
Loop
'/////////////////////////////////////////////////////
Sub Read1820()
1Wread d0,9 ' read all 9bytes
If Crc8(d0,9)=0 Then ' check Crc, if OK
CalcTmp() ' calc temp
Else
Locate 1,10: Lcd "CRC"
End If
End Sub
'/////////////////////////////////////////////////////
Sub CalcTmp() ' calc for 0.1C resolution
' T is 10 times greater (integer)
If d0.1 Then Decr d0 ' if odd decrement
T=(50*d0-25+(100*(d7-d6))/d7)/10
Locate 1,10: Lcd T
End SubКод: Выделить всё
.include "inc\2313DEF.INC"
;
.DSEG
.ORG 0x60
t: .byte 2
d0: .byte 1
d1: .byte 1
d2: .byte 1
d3: .byte 1
d4: .byte 1
d5: .byte 1
d6: .byte 1
d7: .byte 1
crc: .byte 1
.CSEG
.ORG 0x0000
_Reset:
ldi yl,byte1(RAMEND)
out SPL,yl
sbiw yl,32
rcall LcdIni
;****** USERS BASIC CODE **********************
;-Line--0021----Lcd "DS1820 T="--
ldi zl,byte1(S000*2)
ldi zh,byte2(S000*2)
rcall _LSc
;-Line--0023----Do--
L0000:
;-Line--0024----If 1Wreset Then--
rcall _1Wrs0
cpi zl,0x01
brsh PC+0x02
rjmp L0003
L0004:
;-Line--0025----1Wwrite &hcc; &h44--
ldi zl,byte1(204)
rcall _1Ww0
ldi zl,byte1(68)
rcall _1Ww0
;-Line--0026----WaitMs 250--
ldi zl,byte1(250)
rcall _Wms
;-Line--0027----1Wreset--
rcall _1Wrs0
;-Line--0028----1Wwrite &hcc; &hbe--
ldi zl,byte1(204)
rcall _1Ww0
ldi zl,byte1(190)
rcall _1Ww0
;-Line--0029----Read1820()--
rcall read1820
;-Line--0030----Else--
rjmp L0002
L0003:
;-Line--0031----Locate 1,10: Lcd "---"--
ldi r24,0x7F
push r24
ldi zl,byte1(10)
pop r24
add r24,zl
rcall _LCtr
ldi zl,byte1(S001*2)
ldi zh,byte2(S001*2)
rcall _LSc
;-Line--0032----End If--
L0002:
;-Line--0033----WaitMs 200--
ldi zl,byte1(200)
rcall _Wms
;-Line--0034----Loop--
rjmp L0000
L0001:
;-Line--0037----Sub Read1820()--
read1820:
;-Line--0039----1Wread d0,9 ' read all 9bytes--
ldi xl,d0
ldi zl,byte1(9)
rcall _1WrA0
;-Line--0040----If Crc8(d0,9)=0 Then ' check Crc, if OK--
ldi xl,d0
clr xh
ldi zl,byte1(9)
rcall _Crc8
push zl
ldi zl,byte1(0)
pop r24
cp r24,zl
breq PC+0x02
rjmp L0007
L0008:
;-Line--0041----CalcTmp() ' calc temp--
rcall calctmp
;-Line--0042----Else--
rjmp L0006
L0007:
;-Line--0043----Locate 1,10: Lcd "CRC"--
ldi r24,0x7F
push r24
ldi zl,byte1(10)
pop r24
add r24,zl
rcall _LCtr
ldi zl,byte1(S002*2)
ldi zh,byte2(S002*2)
rcall _LSc
;-Line--0044----End If--
L0006:
;-Line--0045----End Sub--
L0005:
ret
;-Line--0048----Sub CalcTmp() ' calc for 0.1C resolution--
calctmp:
;-Line--0051----If d0.1 Then Decr d0 ' if odd decrement--
lds r24,d0
sbrs r24,1
rjmp L0011
L0012:
lds zl,d0
dec zl
sts d0,zl
L0011:
;-Line--0052----T=(50*d0-25+(100*(d7-d6))/d7)/10--
ldi zl,byte1(50)
ldi zh,byte2(50)
push zh
push zl
lds zl,d0
clr zh
pop r24
pop r25
rcall Mp16u
push zh
push zl
ldi zl,byte1(25)
ldi zh,byte2(25)
pop r24
pop r25
sub r24,zl
sbc r25,zh
mov zl,r24
mov zh,r25
push zh
push zl
ldi zl,byte1(100)
ldi zh,byte2(100)
push zh
push zl
lds zl,d7
clr zh
push zh
push zl
lds zl,d6
clr zh
pop r24
pop r25
sub r24,zl
sbc r25,zh
mov zl,r24
mov zh,r25
pop r24
pop r25
rcall Mp16u
push zh
push zl
lds zl,d7
clr zh
pop r24
pop r25
rcall Di16u
pop r24
pop r25
add zl,r24
adc zh,r25
push zh
push zl
ldi zl,byte1(10)
ldi zh,byte2(10)
pop r24
pop r25
rcall Di16u
sts t,zl
sts t+1,zh
;-Line--0053----Locate 1,10: Lcd T--
ldi r24,0x7F
push r24
ldi zl,byte1(10)
pop r24
add r24,zl
rcall _LCtr
lds zl,t
lds zh,t+1
rcall _W2Str
rcall _LBW
;-Line--0054----End Sub--
L0009:
ret
;****** END OF USER BASIC CODE ****************
; String constants:
S000: .db "DS1820 T=", 0
S001: .db "---", 0
S002: .db "CRC", 0
;////// LcdInit ///////////////////////////
LcdIni: in zl,DDRD
ori zl,0xf0
out DDRD,zl
sbi DDRB,4
sbi DDRB,5
cbi PORTB,4
cbi PORTB,5
ldi zl,0x18
rcall _Wms
ldi r24,0x03
rcall _LOut
ldi zl,0x08
rcall _Wms
rcall _LEN
ldi zl,0x0d
rcall _Wus
rcall _LEN
cbi PORTD,4
rcall _LEN
ldi r24,0x28
rcall _LCtr
ldi r24,0x06
rcall _LCtr
ldi r24,0x0c
rcall _LCtr
ldi r24,0x01
rcall _LCtr
ldi zl,0x04
rcall _Wms
ret
_Lch: sbi PORTB,4
rjmp _LNib
_LCtr: cbi PORTB,4
_LNib: mov r21,r24
swap r24
rcall _LOut
mov r24,r21
_LOut: in r23,PORTD
andi r23,0x0f
swap r24
andi r24,0xf0
or r24,r23
out PORTD,r24
rcall _LEN
ret
;////// LcdEN /////////////////////////////
_LEN: sbi PORTB,5
Nop
Nop
cbi PORTB,5
push zl
ldi zl,0x04
rcall _Wus
pop zl
ret
;////// LCD Byte & Word ///////////////////
_LBW: ld r24,Z+
tst r24
breq _LBW1
rcall _Lch
rjmp _LBW
_LBW1: ret
;////// LCD string constants //////////////
_LSc: lpm
adiw zl,0x01
tst r0
breq _LSc1
mov r24,r0
rcall _Lch
rjmp _LSc
_Lsc1: ret
;////// 1Wreset ///////////////////////////
_1Wrs0: sbi DDRD,3
cbi PORTD,3
ldi zl,50
rcall _Wus
cbi DDRD,3
ldi zl,7
rcall _Wus
sbic PIND,3
ret
ldi zl,50
rcall _Wus
ldi zl,1
ret
;////// 1Wwrite ///////////////////////////
_1Ww0: mov r24,zl
ldi zh,8
sbi DDRD, 3
_1Ww10: cbi PORTD,3
rcall _W5
ror r24
brcc _1Ww20
sbi PORTD,3
_1Ww20: ldi zl,5
rcall _Wus
sbi PORTD,3
rcall _W5
dec zh
brne _1Ww10
ret
;////// 1Wread ////////////////////////////
_1Wr0: ldi r24,8
_1Wr10: cbi PORTD,3
rcall _W5
cbi DDRD,3
ldi zl,2
rcall _Wus
clc
sbic PIND,3
sec
ror zh
ldi zl,5
rcall _Wus
sbi PORTD,3
sbi DDRD,3
rcall _W5
dec r24
brne _1Wr10
mov zl,zh
ret
;////// 1WireReadAll //////////////////////
_1WrA0: mov r25,zl
_1rA10: rcall _1Wr0
st X+,zl
dec r25
brne _1rA10
ret
;////// CalcCrc8 //////////////////////////
_Crc8: mov r25,zl
clr zl
ldi r21,0x8c
_Cr81: ldi r24,8
ld zh,X+
_Cr82: mov r23,zh
andi r23,0x01
mov r22,zl
andi r22,0x01
eor r22,r23
lsr zl
lsr zh
sbrc r22,0
eor zl,r21
dec r24
brne _Cr82
dec r25
brne _Cr81
ret
;////// IntToStr //////////////////////////
_B2str: clr zh
clt
rjmp _W2st4
_W2str: clt
rjmp _W2st4
_I2str: clt
sbrs zh,0x07
rjmp _W2st4
com zl
com zh
subi zl,-0x01
sbci zh,-0x01
Set
_W2st4: push yl
push r6
clr r6
st -Y,r6
_N2str: ldi r21,0x10
sub r22,r22
_N2st1: lsr r6
rol zl
rol zh
rol r22
rol r6
cpi r22,0x0a
brcs _N2st2
sbci r22,0x0a
inc zl
_N2st2: dec r21
brne _N2st1
subi r22,-0x30
st -Y,r22
mov r22,zl
or r22,zh
brne _N2str
_N2st5: brtc _N2st3
ldi zl,0x2d
st -Y,zl
_N2st3: mov zl,yl
pop r6
pop yl
ret
;////// _Waitms ///////////////////////////
_Wms: ldi r20,0x14
_Wms1: ldi r21,0x3D
_Wms2: dec r21
brne _Wms2
dec r20
brne _Wms1
dec zl
brne _Wms
ret
;////// _waitus ///////////////////////////
_wus: ldi r22,11
_wus1: dec r22
brne _wus1
dec zl
brne _wus
ret
;////// Wait 5us //////////////////////////
_W5: ldi r21,3
_W51: dec r21
brne _W51
ret
;////// 16x16 unsigned multiplay //////////
Mp16u: clr r23
clr r22
ldi r21,0x10
lsr zh
ror zl
m16u1: brcc m16u2
add r22,r24
adc r23,r25
m16u2: ror r23
ror r22
ror zh
ror zl
dec r21
brne m16u1
ret
;////// 16/16 unsigned division ///////////
Di16u: mov r22,zl
mov r23,zh
mov zl,r24
mov zh,r25
clr r24
sub r25,r25
ldi r20,0x11
d16u1: rol zl
rol zh
dec r20
brne d16u2
ret
d16u2: rol r24
rol r25
sub r24,r22
sbc r25,r23
brcc d16u3
add r24,r22
adc r25,r23
clc
rjmp d16u1
d16u3: sec
rjmp d16u1
;System Global Variables: 0 bytes
;User Global Variables: 11 bytesКод: Выделить всё
:020000020000FC
:10000000CFEDCDBFA0979AD0EAE2F1E0D3D0DAD01D
:10001000E13008F40DC0ECECE2D0E4E4E0D0EAEF2B
:1000200043D1D0D0ECECDBD0EEEBD9D00DD009C071
:100030008FE78F93EAE08F918E0FA0D0E4E3F1E099
:10004000B9D0E8EC31D1E3CFA2E6E9E0EAD0A2E60C
:10005000BB27E9E0ECD0EF93E0E08F918E1709F039
:1000600002C00BD009C08FE78F93EAE08F918E0F0B
:1000700085D0E8E3F1E09ED008958091620081FF91
:1000800005C0E0916200EA95E0936200E2E3F0E0EF
:10009000FF93EF93E0916200FF278F919F9117D11B
:1000A000FF93EF93E9E1F0E08F919F918E1B9F0BFF
:1000B000E82FF92FFF93EF93E4E6F0E0FF93EF933F
:1000C000E0916900FF27FF93EF93E0916800FF271D
:1000D0008F919F918E1B9F0BE82FF92F8F919F91EE
:1000E000F6D0FF93EF93E0916900FF278F919F91E6
:1000F000FDD08F919F91E80FF91FFF93EF93EAE0F6
:10010000F0E08F919F91F2D0E0936000F093610056
:100110008FE78F93EAE08F918E0F30D0E0916000EF
:10012000F09161009AD040D0089544533138323074
:1001300020543D002D2D2D0043524300E1B3E06FCC
:10014000E1BBBC9ABD9AC498C598E8E1ADD083E004
:100150001AD0E8E0A9D01FD0EDE0AFD01CD0949821
:100160001AD088E20BD086E009D08CE007D081E07D
:1001700005D0E4E099D00895C49A01C0C498582FDE
:10018000829501D0852F72B37F708295807F872BF7
:1001900082BB01D00895C59A00000000C598EF9376
:1001A000E4E08BD0EF9108958191882311F0E4DF92
:1001B000FBCF0895C8953196002019F0802DDCDF23
:1001C000F9CF08958B9A9398E2E377D08B98E7E084
:1001D00074D083990895E2E370D0E1E008958E2F02
:1001E000F8E08B9A93986FD0879508F4939AE5E09E
:1001F00064D0939A68D0FA95A9F7089588E0939807
:1002000062D08B98E2E059D0889483990894F7954E
:10021000E5E053D0939A8B9A56D08A9581F7EF2FC9
:1002200008959E2FEBDFED939A95E1F708959E2FA9
:10023000EE275CE888E0FD917F2F71706E2F617072
:100240006727E695F69560FDE5278A95A9F79A95C3
:1002500089F70895FF27E8940AC0E89408C0E89455
:10026000F7FF05C0E095F095EF5FFF4F6894CF93DF
:100270006F9266246A9250E1661B6694EE1FFF1F20
:10028000661F661C6A3010F06A40E3955A95A9F71C
:10029000605D6A936E2F6F2B71F716F4EDE2EA93AF
:1002A000EC2F6F90CF91089544E15DE35A95F1F7FB
:1002B0004A95D9F7EA95C1F708956BE06A95F1F789
:1002C000EA95D9F7089553E05A95F1F708957727FD
:1002D000662750E1F695E79510F4680F791F77953A
:1002E0006795F795E7955A95B9F708956E2F7F2F83
:1002F000E82FF92F8827991B41E1EE1FFF1F4A9530
:1003000009F40895881F991F861B970B20F4860F08
:0A031000971F8894F2CF0894F0CFF5
:00000001FF
Код: Выделить всё
;подпрограмма перевода шестнадцатиричного числа (r16 L,r17 H) и вывода на дисплей
hexd3: andi r17,$03
ldi r20,$30
gexx5: mov r18,r16 ;сохраним
mov r19,r17
subi r16,100 ;вычитаем сотню
sbci r17,0
brcs gexx6 ;проверка
inc r20
rjmp gexx5
gexx6: mov r17,r20
rcall d_out
mov r16,r18 ;восст сохраненное
ldi r20,$30
gexx7: mov r18,r16 ;сохраним
subi r16,10 ;вычитаем десять
brcs gexx8 ;проверка
inc r20
rjmp gexx7
gexx8: mov r17,r20
rcall d_out
ldi r17,$30
add r17,r18
rcall d_out
ret
Вы не с асмом сравнивайте, а с одним из языков высокого уровня.eufs писал(а):По меньшей мере вдвое короче будет, если на асме написать.
Смотрите, в программе есть вычисление температуры:eufs писал(а):Например поясните назначение подпрограмм умножения 16х16 и деления 16/16 для конечного результата. Даже если они нужны(что сомнительно), все равно размерность всех необходимых переменных не превышает байта для той точности показаний, которая выбрана.
Код: Выделить всё
T=(50*d0-25+(100*(d7-d6))/d7)/10Код: Выделить всё
Dim T As WordНу на асме я могу нормально написать, но языки высокого уровня не способны "вылизывать" код.eufs писал(а):Крайне коряво написана пп вывода числа на дисплей,как и его инициализация(избыточно).
Ждем не фигню на Си, который вы нахваливалиeufs писал(а):Фигня вобщем.
Ждемс, и посмотрим.eufs писал(а):Если сишный компилятор еще более менее компактно создает
Откуда и что берется я видел. Вы сознательно применяете арифметические операции, и вордовые переменные чтобы код был длинее? И еще утверждаете что на асме можете писать компактно?Мурик писал(а):Смотрите, в программе есть вычисление температуры:и при том, переменная T типа Word (2 байта).Код: Выделить всё
T=(50*d0-25+(100*(d7-d6))/d7)/10Ноги именно отсюда растут.Код: Выделить всё
Dim T As Word
Ну на асме я могу нормально написать, но языки высокого уровня не способны "вылизывать" код.
Ждем не фигню на Си, который вы нахваливалиЖдемс, и посмотрим.eufs писал(а):Если сишный компилятор еще более менее компактно создает
Сейчас этой необходимости нет, поэтому могу выложить модули работы с дисплеем и далласом на асме. Перевод чисел и вывод на дисплей уже есть.eufs писал(а):PS. Я программирую на асме. На си писал, когда была необходимость
Нет, это пример из дистрибутива компилятора. Просто взял не банальный, типа мигания светодиодом, а посложнее.eufs писал(а):Вы сознательно применяете арифметические операции, и вордовые переменные чтобы код был длинее?
Код: Выделить всё
$Device= 8515 ' used device
$Stack = 32 ' stack depth
$Clock = 7.3728 ' used crystal
$Source= On ' basic source in Asm
Dim n As Byte
DDRB=&hff ' PortB is output
n=&hfe ' init n
Do ' never ending loop
PORTB=n ' n out to port
Rotate(Left, 1, n) ' rotate n left one bit
WaitMs 100 ' 100ms delay
Loop ' back to start of loopКод: Выделить всё
.include "inc\8515DEF.INC"
;
.DSEG
.ORG 0x60
n: .byte 1
.CSEG
.ORG 0x0000
_Reset:
ldi yl,byte1(RAMEND)
out SPL,yl
ldi yh,byte2(RAMEND)
out SPL+1,yh
sbiw yl,32
;****** USERS BASIC CODE **********************
;-Line--0012----DDRB=&hff ' PortB is output--
ldi zl,byte1(255)
out DDRB,zl
;-Line--0013----n=&hfe ' init n--
ldi zl,byte1(254)
sts n,zl
;-Line--0015----Do ' never ending loop--
L0000:
;-Line--0016----PORTB=n ' n out to port--
lds zl,n
out PORTB,zl
;-Line--0017----Rotate(Left, 1, n) ' rotate n left one bit--
lds zl,n
ldi r24,1
rcall _RotBL
sts n,zl
;-Line--0018----WaitMs 100 ' 100ms delay--
ldi zl,byte1(100)
rcall _Wms
;-Line--0019----Loop ' back to start of loop--
rjmp L0000
L0001:
;****** END OF USER BASIC CODE ****************
;////// RotateLeftByte ////////////////////
_RotBL: lsl zl
brcc _RtBL1
sbr zl,1
_RtBL1: dec r24
brne _RotBL
ret
;////// _Waitms ///////////////////////////
_Wms: ldi r20,0x14
_Wms1: ldi r21,0x7A
_Wms2: dec r21
brne _Wms2
dec r20
brne _Wms1
dec zl
brne _Wms
ret
;System Global Variables: 0 bytes
;User Global Variables: 1 bytesКод: Выделить всё
:020000020000FC
:10000000CFE5CDBFD2E0DEBFA097EFEFE7BBEEEFCD
:10001000E0936000E0916000E8BBE091600081E067
:1000200005D0E0936000E4E607D0F4CFEE0F08F4CB
:10003000E1608A95D9F7089544E15AE75A95F1F7B6
:0A0040004A95D9F7EA95C1F7089533
:00000001FFКод: Выделить всё
.include "m8515def.inc"
begin: ser r16
out ddrb,r16
clr r17
clr r18
ldi r16,1
loop: out portb,r16
rol r16
tr0: dec r17
brne tr0
dec r18
brne tr0
rjmp loop Код: Выделить всё
:020000020000FC
:100000000FEF07BB1127222701E008BB001F1A953D
:08001000F1F72A95E1F7F9CFA1
:00000001FFВы на Си покажите этот код в 12 команд.eufs писал(а):И код 12 команд
Вот покажите не бред на Си, иначе это были пустые слова!eufs писал(а):Если сишный компилятор еще более менее компактно создает, хотя и с избыточностью, то бейсик формирует полный бред вообще.
С чего вы взяли что я что-то буду писать на Си, декомпилировать? Я могу выложить тот файл после бейсика, который видел сам (кодировка дос!). Попробуйте хоть что-то там понять. Бейсик по определению язык более высокого уровня чем си, из-за этого более избыточен при компилировании. Я написал вам код на асме в три раза короче - и это элементарная программа. Пишите на асме - и не будет споров что лучше - си или бейсик. АСМ forever!Мурик писал(а):Вы на Си покажите этот код в 12 команд.eufs писал(а):И код 12 команд
Вы же писали чтоВот покажите не бред на Си, иначе это были пустые слова!eufs писал(а):Если сишный компилятор еще более менее компактно создает, хотя и с избыточностью, то бейсик формирует полный бред вообще.
А асм с языком высокого уровня глупо сравнивать!
Зачем? Ведь я выложил проги на бейсике и их ассемблерные листинги.eufs писал(а):Я могу выложить тот файл после бейсика, который видел сам.
Ну вот опять за старое.eufs писал(а):Бейсик по определению язык более высокого уровня чем си, из-за этого более избыточен при компилировании.
Понимаете, я могу написать на бейсике и получу почти тоже самое, ведь код довольно оптимальный учитывая что это язык высокого уровня.eufs писал(а):Пишите на асме - и не будет споров что лучше - си или бейсик. АСМ forever!
Вот покажите не бред на Си
Код: Выделить всё
void main(void)
{
register volatile unsigned char x=1;
DDRB=0xFF;
while (1)
{
PORTB=x;
x=(x)?(x<<1):(1);
_delay_ms(100);
}
}
Код: Выделить всё
---- test.c ---------------------------------------------------------------------------------------
6: register volatile unsigned char x=1;
+00000028: E081 LDI R24,0x01 Load immediate
+00000029: 8389 STD Y+1,R24 Store indirect with displacement
8: DDRB=0xFF;
+0000002A: EF8F SER R24 Set Register
+0000002B: B984 OUT 0x04,R24 Out to I/O location
---- d:\WinAVR\avr\include\util\delay_basic.h -----------------------------------------------------
105: __asm__ volatile (
+0000002C: EC28 LDI R18,0xC8 Load immediate
+0000002D: E030 LDI R19,0x00 Load immediate
---- test.c ---------------------------------------------------------------------------------------
12: PORTB=x;
+0000002E: 8189 LDD R24,Y+1 Load indirect with displacement
+0000002F: B985 OUT 0x05,R24 Out to I/O location
13: x=(x)?(x<<1):(1);
+00000030: 8189 LDD R24,Y+1 Load indirect with displacement
+00000031: 2388 TST R24 Test for Zero or Minus
+00000032: F411 BRNE PC+0x03 Branch if not equal
+00000033: E081 LDI R24,0x01 Load immediate
+00000034: C002 RJMP PC+0x0003 Relative jump
+00000035: 8189 LDD R24,Y+1 Load indirect with displacement
+00000036: 0F88 LSL R24 Logical Shift Left
+00000037: 8389 STD Y+1,R24 Store indirect with displacement
+00000038: EE88 LDI R24,0xE8 Load immediate
+00000039: E093 LDI R25,0x03 Load immediate
+0000003A: 01F9 MOVW R30,R18 Copy register pair
+0000003B: 9731 SBIW R30,0x01 Subtract immediate from word
+0000003C: F7F1 BRNE PC-0x01 Branch if not equal
---- d:\WinAVR\avr\include\util\delay.h -----------------------------------------------------------
124: __ticks --;
+0000003D: 9701 SBIW R24,0x01 Subtract immediate from word
120: while(__ticks)
+0000003E: F7D9 BRNE PC-0x04 Branch if not equal
+0000003F: CFEE RJMP PC-0x0011 Relative jump
+00000040: 94F8 CLI Global Interrupt Disable
+00000041: CFFF RJMP PC-0x0000 Relative jump
Что Си, что бейсик одного поля ягоды. Они дают скорость в разработке программ в ущерб их оптимальности в плане длины и скорости работы. Если вы преднамеренно с этим соглашаетесь - спора нет. Бейсик в этом плане ХУЖЕ. Даже по определению. Вот и все.Мурик писал(а):Или вы реально считаете что те проги что я выложил на бейсике слишком избыточны учитывая что созданы с помощью языка высокого уровня и на Си можно сделать во много раз компактнее и оптимальнее? Если да, то примеры встудию, а если нет, то в чем предмет спора?
Вы заблуждаетесь. О какой опитмальности идет речь, если программы получаются в разы дленнее. Вставки на асме не безобидная вещь, так как требует вмешательства в конечный код. При этом существует проблема передачи значений переменных и сохранения регистров.
Понимаете, я могу написать на бейсике и получу почти тоже самое, ведь код довольно оптимальный ......skip.....Это будет проще и быстрее чем писать полностью на ассемблере.![]()
Я преставляю себе ядро Windows на бейсике. Не смешите. Всему свое применение.Так что не нужно хаять бейсик - он хороший.
Бейсиков для компа это тоже касается, т. к. есть весьма достойные компиляторы, но их списывают со счетов только лишь потому что это бейсик.
Код: Выделить всё
Dim n As Byte
DDRB=&hff ' PortB is output
n=1 ' init n
Do ' never ending loop
PORTB=n ' n out to port
Shift(Left, 1, n) ' rotate n left one bit
WaitMs 100 ' 100ms delay
LoopКод: Выделить всё
;****** USERS BASIC CODE **********************
;-Line--0012----DDRB=&hff ' PortB is output--
ldi zl,byte1(255)
out DDRB,zl
;-Line--0013----n=1 ' init n--
ldi zl,byte1(1)
sts n,zl
;-Line--0015----Do ' never ending loop--
L0000:
;-Line--0016----PORTB=n ' n out to port--
lds zl,n
out PORTB,zl
;-Line--0017----shift(Left, 1, n) ' rotate n left one bit--
lds zl,n
lsl zl
sts n,zl
;-Line--0018----WaitMs 100 ' 100ms delay--
ldi zl,byte1(100)
rcall _Wms
;-Line--0019----Loop--
rjmp L0000
L0001:
;****** END OF USER BASIC CODE ****************
;////// _Waitms ///////////////////////////
_Wms: ldi r20,0x14
_Wms1: ldi r21,0x11
_Wms2: dec r21
brne _Wms2
dec r20
brne _Wms1
dec zl
brne _Wms
retЯ по моему не писал что на языке высокого уровня получаются проги оптимальнее чем на асме, хотя тут многое зависит от прокладки между креслом и монитором. Если нет опыта, то на асме можно создать прогу похуже чем на языке высокого уровня, но сейчас речь не об этом.eufs писал(а):Они дают скорость в разработке программ в ущерб их оптимальности в плане длины и скорости работы. Если вы преднамеренно с этим соглашаетесь - спора нет.
Выше показал что на бейсике прога содержит меньше инструкций. Тогда чем хуже? Только лишь тем что это бейсик? А если бы назывался по другому то сразу стал-бы намного ЛУЧШЕ?eufs писал(а):Бейсик в этом плане ХУЖЕ. Даже по определению.
Хм, бейсик это всего лишь название языка программирования и что мешает создать для него компилятор, с помощью которого можно создать ядро ОС? Другое дело что этим вряд ли будут заморачиваться.eufs писал(а):Я преставляю себе ядро Windows на бейсике.
Как раз от этой прокладки зависит выбор среды програмирования, ибо от этого зависят возможности, краткость реализации, а в конечном итоге - полнота использования ресурсов МК. А это называется профессионализмом. На пионерском бейсике - пионерское и получается. Спорьте или нет, ежу понятно, что на асме можно сделать на том же кристалле и с теми же ножками больше и лучше. Но если вам хватает бейсика - никто не против.Мурик писал(а):
Я по моему не писал что на языке высокого уровня получаются проги оптимальнее чем на асме, хотя тут многое зависит от прокладки между креслом и монитором.
Это к чему? Попкорн закончился?Кислый писал(а):Мне ситуация напомнила о геях. Вроде и конкуренция меньше ( на самочек не притендуют ), а в голову всёравно хочется дать.