Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
 Аватар для contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606

Книги по Assembler

12.12.2013, 23:40. Показов 3451. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго вечера!
Посоветуйте, пожалуйста, хорошие книги по ассемблеру... Пытаюсь написать свой загрузчик к ОС (изучаю исключительно в познавательных целях - интересно просто ), но все книги, которые нахожу заточены под Windows и MS-DOS... Есть ли какие-нибудь книги, которые изучали бы именно работу с BIOS и работу с процессором в защищенном режиме...

P.S. Конкретно проблемные места - это плохое понимание адресации памяти в реальном и защищенном режиме, работа с носителями, вообще, с файловой системой (не могу понять как передать управление, например, на ядро, находящееся в папке kernel), и проблема с пониманием передачи управления и копирования программой самой себя по другому адресу.

Возможно, вопросы не все корректные, но как я уже написал, я не понимаю этого и не могу точно понять, что конкретно мне нужно изучить для этого...

Вся полезная информация, особенно учебники привествуются...

Заранее большое спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.12.2013, 23:40
Ответы с готовыми решениями:

Книги для начинающего на Assembler
Доброго времени суток. Посоветуйте книги по Assembler'у для начинающего. Мало что понимаю в коде, а уж тем более, что писать. Скачал...

Продам книги Assembler, Delphi, Pascal, VB.NET, C++ (Москва)
г. Москва, все книги по 100р в отличном состоянии. 1. Абашев А.А., Жуков И.Ю., Иванов М.А., Метлицкий Ю.В., Тетерин И.И. Ассемблер в...

Посоветуйте книги или ресурсы для изучения Assembler
Посоветуйте книги или ресурсы для изучения Assembler новичкам.

36
 Аватар для contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
16.12.2013, 23:15  [ТС]
Студворк — интернет-сервис помощи студентам
Можете подробнее пояснить эту часть кода?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mov edx, 0x01F6 
shr eax, 24 
or al, 11100000b 
out dx, al
 
mov edx, 0x01F2 
mov al, 100 
out dx, al
 
mov edx, 0x1F3 
mov eax, ebx 
out dx, al
 
mov edx, 0x1F4 
mov eax, ebx 
shr eax, 8
out dx, al
 
 
mov edx, 0x1F5 
mov eax, ebx 
shr eax, 16 
out dx, al
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
16.12.2013, 23:17
Цитата Сообщение от contedevel Посмотреть сообщение
В реальном режиме я смогу использовать функции BIOS, но как потом быть в Protected Mode, когда необходимо будет загрузить само ядро?
Самый простой вариант - вручную узнать расположение файла, загрузить его данные в ОЗУ и передать управление. Более продвинутых исходников для FAT достаточно.
1
 Аватар для contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
16.12.2013, 23:19  [ТС]
Таблица файлов получается должна размещаться после загрузочного сектора? Тогда как можно найти в ней адрес нужного мне файла и загрузить его в память допустим по 0x8000? Извините, просто уже неделю сижу с этим, а понять так и не могу(
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
16.12.2013, 23:22
Цитата Сообщение от contedevel Посмотреть сообщение
mov edx, 0x01F6
shr eax, 24
or al, 11100000b
out dx, al
Меняем адресацию на LBA.

Цитата Сообщение от contedevel Посмотреть сообщение
mov edx, 0x01F2
mov al, 100
out dx, al
mov edx, 0x1F3
mov eax, ebx
out dx, al
mov edx, 0x1F4
mov eax, ebx
shr eax, 8
out dx, al
mov edx, 0x1F5
mov eax, ebx
shr eax, 16
out dx, al
Конвертируем значение из EBX в биты и передаем их значение в порты. Это выбор сектора для чтения-записи.

Добавлено через 2 минуты
contedevel, если из файловой системы выдрать лишнее, то она уместится в загрузчике в 512 байт. Извините, если темню, просто с этим у меня крайне мало опыта.
1
 Аватар для contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
16.12.2013, 23:26  [ТС]
Я, вроде, понял, как быть с вторичным загрузчиком, но дальше необходимо будет выполнять загрузку ядра, а из него прочее компонентов, поэтому если все будет находится друг за другом, получиться очень сложно работать с таким носителем, то есть нужна во вторичном загрузчики работа с файловой системой в режиме readonly, но у меня не достаточно знаний, чтобы это реализовать, а информация очень скудная по этому или я ищу неправильно
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
16.12.2013, 23:31
contedevel, ядро можно просто прочитать с HDD, поместить в ОЗУ и передать управление. По крайней мере, в моих набросках ОС все так и реализовано.
1
930 / 846 / 190
Регистрация: 28.11.2013
Сообщений: 3,621
16.12.2013, 23:33
Цитата Сообщение от mashuly Посмотреть сообщение
У меня устаревшее железо. Поэтому скидываю то, что реально протестировано.
В любом случае этому коду не место в первичном загрузчике.

Цитата Сообщение от contedevel Посмотреть сообщение
У меня имеется первичный загрузчик в первом секторе, за ним идёт вторичный и ядро, т.е. мне необходимо считать последующие сектора (сколько он занимает) вторичного загрузчика в память, а из него считать ядро и передать на него управление?
Примитив. Готовьте отдельный диск для экспериментов на реальном железе. Придется помучиться.

В реальном режиме я смогу использовать функции BIOS, но как потом быть в Protected Mode, когда необходимо будет загрузить само ядро?
В большинстве ОС ядро грузится первичным или вторичным загрузчиком при помощи BIOS. Большие порции данных загружаются вторичным загрузчиком при помощи многократного переключения между реальным и защищенным режимами (или путем переключения в "нереальный" режим).
1
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
16.12.2013, 23:33
Можно сделать искусственную защиту секторов с ядром ОС, что бы ненароком "суицида" не было.
1
 Аватар для contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
16.12.2013, 23:37  [ТС]
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
section .text
    use16
    org  0x7C00       ; Boot Loader starts at 0:0x7c00
start:
  jmp boot_code
  db 0x90
BS_OEMName:
  times 8 db ' ' 
BPB_BytsPerSec:     ; 0x0b Bytes per sector 512,1024,2048 or 4096
  dw 0x200
BPB_SecPerClus:     ; 0x0d Sectors per Cluster
  db 0
BPB_RsvdSecCnt:     ; 0x0e Reserved sectors count
  dw 0
BPB_NumFATs:       ; 0x10 FATs number
  db 0
BPB_RootEntCnt:      ; 0x11 (not used for FAT32)
    dw 0
BPB_TotSec16:        ; 0x13 (not used for FAT32)
    dw 0
BPB_Media:           ; 0x15 (not used)
    db 0
BPB_FATSz16:        ; 0x16 (not used for FAT32)
    dw 0
BPB_SecPerTrk:       ; 0x18 (SPT geometry for CHS)
  dw 0
BPB_NumHeads:       ; 0x1a (HPC geometry for CHS)
  dw 0
BPB_HiddSec:         ; 0x1c (Sectors before this partition)
  dd 0
BPB_TotSec32:        ; 0x20 (Total sectors must be !=0 for FAT32)
    dd 0
BPB_FATSz32:        ; 0x24 Sectors count in one FAT
  dd 0
BPB_ExtFlags:         ; 0x28 See Microsoft document
  dw 0
BPB_FSVer:           ; 0x2a Version of FAT32 filesystem
  dw 0
BPB_RootClus:         ; 0x2c Root Directory cluster number
  dd 0
BPB_FSInfo:           ; 0x30 Reserved = 1 usially see doc...
  dw 0
BPB_BkBootSec:       ; 0x32 Sector in reserve area with Boot Sect Copy
  dw 0
BPB_Reserved:
  times 12 db 0
BS_DrvNum:           ; 0x40 Drive number for int 0x13
  db 0
BS_Reserved1:         ; 0x41
  db 0
BS_BootSig:            ; 0x42 0x29 means that next fields present
  db 0
BS_VolID:              ; 0x43 Volume ID 32 bit value
  dd 0
BS_VolLab:             ; 0x47
  times 11 db ' '
BS_FilSysType:         ; 0x52 "FAT32   " 
  db 'FAT32   '
 
; parameter block for read sector
read_sector_data:       ; 0x5a
  dw 0x10
sectors_count:
  dw 0x01
read_offset:
  dw 0x00
read_segment:
  dw 0x80
lba_lo:
  dw 0x00
lba_hi:
  dw 0x00
lba_hihi:
  dw 0x00
  dw 0x00
 
; kernel file name
kernel:
  db 'KERNEL     '
 
boot_code:             ; 0x5a boot code start
  cli
  xor ax, ax
  mov ss, ax
  mov sp, start        ; set stack pointer and segments
  mov bp,sp
  mov ds, ax
  mov es, ax
  sub sp,0x80         ; reserve 0x80 byte for local variables
  sti
; get cluster chain starting from specified
  push dx                ; [ bp - 82 ] BIOS disk number
get_first_data_sector:
  mov eax, [ bp + BPB_FATSz32 - start ]
  movzx ecx, byte [ bp + BPB_NumFATs - start ]
  mul ecx
  movzx ecx, word [ bp + BPB_RsvdSecCnt - start ]
  add ecx, [ bp + BPB_HiddSec - start ]
  push ecx            ; [ bp - 86 ] reserved + hidden
  add eax, ecx
; here 0x2fc0
  push eax            ; [ bp - 8a ] first data sector
calc_sector_size:
    movzx ax, byte [ bp + BPB_SecPerClus - start ]
    push ax             ; [ bp - 0x8c ]  sectors per cluster
    mul word [ bp + BPB_BytsPerSec - start ]
    shr ax, 4
; here 0x400
    push ax             ; [ bp - 0x8e ] segment increment for cluster
;   mov bx,ax
;   shr eax,16
;   call print_regs
;   jmp $
  mov bx, search_kernel_file
  call read_cluster_chain
  jc error
; we have the kernel here
; initialize segment where to write kernel data
; kernel will be loaded to position 0:0x10000
; (just after the bool sector)
  mov word [ bp + read_segment - start ], 0x1000 ; kernel start segment
  mov al, [ bp + BPB_SecPerClus - start ]
  mov [ bp + sectors_count - start ], al ; number of sectors to read
  ; only one iteration is required ( reading whole cluster by one operation)
  mov byte [ bp - 0x8c ], 0x1 ; number of iterations in read_cluster_chain
  mov bx, read_kernel_file
read_cluster_chain:
   mov eax, [ bp + BPB_RootClus - start ]   ; current cluster to read
   cmp eax, 0xffffff7
   jl rcc_continue
;;;;
;;;; kernel is loaded if bx == read_kernel_file  
   cmp bx, read_kernel_file
   jne error
;   mov ax, 0xCAFE
;   call print_regs
; switch to protected mode
; and jump to kernel
 
 lgdt  [ gdtr ]
   
  in al, 0x92
  or al, 2
  out 0x92, al
 
  mov eax, cr0
  or al, 1 
  mov cr0, eax
     
  jmp 0x8: _protected 
 
  use32
_protected:
  ; jump to kernel
  jmp 0x8:0x10000
 
  use16
 
   rcc_continue:
    call get_sector_by_cluster
    ; number of iterations
    ; for reading sectors one by one
    movzx cx, byte [ bp - 0x8c ]     ; sectors to read
    
rcc_read_next:
    call read_sector
; registrers don't restored if error is happen
; we don't need them just show error message
; sorry saving 1 byte <img src="http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif?m=1129645325g" alt=":)" class="wp-smiley">
 
    pusha
        call bx            ; process sector data
    popa
    jc rcc_to_next_sector
; processing function finished it's work
; actually it happens only for search directory
; this return can be changed later
    ret
 
error:
  int 0x18
     
rcc_to_next_sector:
    inc eax
    loop rcc_read_next
     
; get next data cluster
; calculate  FAT sector to read
; read FAT
; get cluster from FAT
    mov eax, [ bp + BPB_RootClus - start ]
    shl eax, 2   ; cluster << 2
    mov dx, ax ; lo word
    shr eax, 16 ; hi word
    xchg ax, dx ; lo <-> hi
    mov cx, word [ bp + BPB_BytsPerSec - start ]
    div cx
    add eax,  [ bp - 0x86 ]  ; reserved + hidden
    push word [ bp + sectors_count - start ] ; sectors to read
   push word [ bp + read_segment - start ] ; where to read
   mov word [ bp + read_segment - start ] , 0x80
   mov byte [ bp + sectors_count - start ], 0x1
   call read_sector
   pop word [ bp + read_segment - start ]
   pop word [ bp + sectors_count - start ]
   mov si , dx
   mov eax, [ si + 0x800 ]
   and eax, 0xfffffff
   mov [ bp + BPB_RootClus - start ], eax
   jmp read_cluster_chain
   
; read sector
; input: read_sector_data area
; output: carry flag (if error happen)
read_sector:                             ; read sector lba mode
  pusha
      mov [ bp + lba_lo - start ] , eax      ; pass LBA address
        mov si, read_sector_data              ; function parameters
        mov ah, 0x42                         ; function number
        mov dl, 0x80                          ; disk number
        int 0x13
    popa
        jc error     ; error happend   
    ret
   
; search file in directory
search_kernel_file:
    mov di, 0x800 ; [ bp + read_offset - start ]
skf_compare_name:
    mov si, kernel
    mov cx, 11
    push di
    repe cmpsb
    pop di
    jne skf_continue
    mov cx, [ di + 26 ]
    mov [ bp + BPB_RootClus - start ], cx
    mov cx, [ di + 20 ]
    mov [ bp + BPB_RootClus + 2 - start ], cx
    clc
    ret
skf_continue:
  add di, 32
  cmp di, 0xa00
  jl skf_compare_name
  stc
  ret
; calculate sector number by cluster number
; input:   eax - cluster number
; output: eax - cluster number
get_sector_by_cluster:
  dec eax
  dec eax
  movzx ecx, byte [ bp + BPB_SecPerClus - start ] 
  mul ecx
  add eax, [ bp - 0x8a ]                ; first data sector
  ret
 
; This function is called each time when kernel file cluster
; has been read. This function just need to increment the
; memory position (where to read next cluster)
read_kernel_file:
  mov ax, [ bp + read_segment - start ]
  add ax, [ bp - 0x8e ]  ; [ bp - 0x8e ] segment increment for cluster
  mov [ bp + read_segment - start ], ax
  stc
  ret
 
  ; alignment
  times 3 db 0x90
   
  gdt:                    ; Address for the GDT
gdt_null:               ; Null Segment
  dd 0
  dd 0
     
gdt_code:               ; Code segment, read/execute, nonconforming
  dw 0FFFFh
  dw 0
  db 0
  db 0x9a
  db 0xcf
  db 0
 
gdt_data:               ; Data segment, read/write, expand down
  dw 0FFFFh
  dw 0
  db 0
  db 0x92
  db 0xcf
  db 0
   
gdt_code16:
  dw 0FFFFh
  dw 0
  db 0
  db 0x9e
  db 0
  db 0
 
gdt_data16:
  dw 0FFFFh
  dw 0
  db 0
  db 0x92
  db 0
  db 0   
         
gdtr:
  dw gdtr-gdt-1
  dd gdt
  
finish:
  times 0x1FE-finish+start db 0
  db   0x55, 0xAA         ; Boot Sector signature
Добавлено через 3 минуты
Нашел вот такой згрузчик, его же по идее можно переделать на загрузку вторичного загрузчика, где будут настраиваться видеорежим и прочее, или эту часть лучше внести в само ядро?
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
16.12.2013, 23:37
Цитата Сообщение от miketomlin Посмотреть сообщение
В большинстве ОС ядро грузится первичным или вторичным загрузчиком при помощи BIOS. Большие порции данных загружаются вторичным загрузчиком при помощи многократного переключения между реальным и защищенным режимами (или путем переключения в "нереальный" режим).
У меня все умещалось в одном загрузчике, и переход в PM и загрузка ядра.
1
930 / 846 / 190
Регистрация: 28.11.2013
Сообщений: 3,621
16.12.2013, 23:40
Уже пытаетесь переключаться в защищенный режим в первичном загрузчике. Оригинально Сразу запихните туда ядро, тогда его вообще можно будет самому не грузить. Короче если понадобятся консультации профессионала, обращайтесь. Спокойной ночи.
1
 Аватар для contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
16.12.2013, 23:41  [ТС]
Цитата Сообщение от miketomlin Посмотреть сообщение
В любом случае этому коду не место в первичном загрузчике.

Примитив. Готовьте отдельный диск для экспериментов на реальном железе. Придется помучиться.
Уже приготовил

Цитата Сообщение от miketomlin Посмотреть сообщение
В большинстве ОС ядро грузится первичным или вторичным загрузчиком при помощи BIOS. Большие порции данных загружаются вторичным загрузчиком при помощи многократного переключения между реальным и защищенным режимами (или путем переключения в "нереальный" режим).
Я об этом как-то не подумал, спасибо! Но как быть с ГТД? Как сохранить ее адресс для повторной загрузки?
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
16.12.2013, 23:41
Цитата Сообщение от contedevel Посмотреть сообщение
или эту часть лучше внести в само ядро?
Ядро можно уместить и в загрузчике, не парясь с файловой системой. Или вам нужно именно с файловой системой?
0
 Аватар для contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
16.12.2013, 23:44  [ТС]
Цитата Сообщение от miketomlin Посмотреть сообщение
Уже пытаетесь переключаться в защищенный режим в первичном загрузчике. Оригинально Сразу запихните туда ядро, тогда его вообще можно будет самому не грузить. Короче если понадобятся консультации профессионала, обращайтесь. Спокойной ночи.
Это не мой загрузчик
Вот тема
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
16.12.2013, 23:44
Цитата Сообщение от contedevel Посмотреть сообщение
Но как быть с ГТД? Как сохранить ее адресс для повторной загрузки?
Если перейти в защищенный режим, загрузив GTD, а потом выйти - то получится нереальный режим, в котором доступно 4 гб ОЗУ. В дальнейшем она уже вряд ли пригодится.
1
 Аватар для contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
16.12.2013, 23:52  [ТС]
Наверное, рано об этом пока думать, но я все же хочу написать, что-то более менее похожее на ОС, поэтому пытаюсь сразу позаботиться о модульности, чтобы потом не переписывать кучу кода, а написать на первое время простой двухуровневый загрузчик ядра, чтобы потом можно было расширять его функциональность, и ядро, которое будет находиться в каталоге kernel, с подключаемыми к нему модулями, просто из ядра хочу постараться исключать все лишенее, что можно загружать уже непосредственно из него

Добавлено через 43 секунды
Под похожим на ОС я не Linux имею в виду) Даже не minix

Добавлено через 34 секунды
Цитата Сообщение от mashuly Посмотреть сообщение
Если перейти в защищенный режим, загрузив GTD, а потом выйти - то получится нереальный режим, в котором доступно 4 гб ОЗУ. В дальнейшем она уже вряд ли пригодится.
Спасибо, не знал об этом!

Добавлено через 3 минуты
Спасибо всем огромное за помощь! Вроде, немного понятно стало (хотя бы что искать )
Извини, завтра в универ рано! Доброй ночи всем!
Можно если еще вопросы будут задам здесь?
0
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
17.12.2013, 00:43
Цитата Сообщение от miketomlin Посмотреть сообщение
Короче если понадобятся консультации профессионала, обращайтесь.

а ниче что тут пока только IDE юзают? код, выложенный ранее, для этого нормальный. что-то не припомню чтобы в иде юзалась 48 битная адресация. хотя мб не те доки читал

Добавлено через 3 минуты
однако нашел про 48-битную адресацию. надо будет почитать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.12.2013, 00:43

Сравнить ФИО из книги 1 и книги 2, и если совпадают, то в столбец А книги 1, подставить данные из столбца В книги 2
Добрый день! Подскажите, как сделать-есть 2 книги. Нужно сравнить фамилии из книги 1 и книги 2 и если ФИО совпадает, то в столбец А книги...

Описать структуру Bibliotec, содержащую следующие поля: автор книги, инвентарный номер книги, название книги
Описать структуру BIBLIOTEC содержащий следующие поля: автор книги , инвентарный номер книги , название книги. Подсчитать , книги скольких...

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

Lvalue required. Добавление строк в Memo - ввод книги, вывод книги по ID.
Вроде библиотечной программы. Ввод книги. Вывод книги по ID. #include &quot;Unit1.h&quot; ...

По выбору книги в запросе выдать сообщение о наличии книги, автору, названию
Всем добрый вечер! (не подумаите ничего плохого, я не &quot;стороник халявы&quot;) Но решение этих задач мне нужно срочно. описание что и как где...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru