[a / aa / ad / au / b / bg / bo / c / d / dg / di / ew / f / fa / fd / fg / fi / fl / g / gg / h / ho / hr / ja / k / ls / m / ma / me / mo / mu / n / ne / o / p / pa / ph / pr / r / re / rf / s / sp / t / td / tr / tv / u / vg / w / wh / wm / wp / y] - [Главная]

[Назад]
Ответ
(оставьте это поле пустым)
Имя (оставьте это поле пустым)
E-mail
Тема
Комментарий
Файл
Перейти к
Подтверждение обновить captcha
Пароль (чтобы удалить пост или файл)
  • Разрешённые типы файлов: GIF, JPG, PNG
  • Максимальный размер файла 1536 килобайт и 2048×2048.
  • Изображения размером более 200x200 точек будут уменьшены.

Файл: 1243615146588.jpg -(39кб, 593x600) Показана уменьшенная копия, оригинал по клику.
39 №432  

семблер-куны опять нужна ваша помошь.
Задание:
На языке Ассемблер написать программу, обеспечивающую 10 циклов поочередного включения на 1с индикаторов Num,Caps,Scroll.
Работа делается на Ассемблере под досом на виртуальной машине.
помоги, уважаемый анон-кун.

Есть такой код:

program Kbd_2;
begin
asm
mov di, 10;
mov AX, 0040h;
mov ES, AX;
mov SI, 006Ch;

@PRG:
mov cx, 3;
mov dx, 00000010b;

@shift_loop:
@CHK1:
in AL, 64h;
and AL, 00000010b;
jnz @CHK1;
mov AL, 11101101b;
out 60h, AL;

@CHK2:
in AL, 64h;
and AL, 00000010b;
jnz @CHK2;
mov Ax, dx;
out 60h, AL;

mov BX, [ES:SI];
add BX, 18;
@W1:
cmp BX, [ES:SI];
jb @W1;
shl dx, 1;
loop @shift_loop;

dec di;
jnz @PRG;

@CHK7:
in AL, 64h;
and AL, 00000010b;
jnz @CHK7;

mov AL, 11101101b;
out 60h, AL;

@CHK8:
in AL, 64h;
and AL, 00000010b;
jnz @CHK8;

mov AL, 00000010b;
out 60h, AL;
end;
end.

сей код не работает, прошу помощи в его исправлении.

>> №433  
Оригинальный код был такой, но добрый анон его подправил, жаль не до конца. код рабочий, но слишном длинный:
program Kbd_2;
begin
asm
mov CL, 10;
mov AX, 0040h;
mov ES, AX;
mov AX, 006Ch;
mov SI, AX;
@PRG:
@CHK1: //здесь начинаются 3 одинаковых цикла (1 цикл)
in AL, 64h;
and AL, 00000010b;
jnz @CHK1;
mov AL, 11101101b;
out 60h, AL;
@CHK2:
in AL, 64h;
and AL, 00000010b;
jnz @CHK2;
mov AL, 00000010b;
out 60h, AL;
mov BX, [ES:SI];
mov DX, BX;
add DX, 18;
@W1:
mov BX, [ES:SI];
cmp BX, DX;
jb @W1;
@CHK3: //2й цикл
in AL, 64h;
and AL, 00000010b;
jnz @CHK3;
mov AL, 11101101b;
out 60h, AL;
@CHK4:
in AL, 64h;
and AL, 00000010b;
jnz @CHK4;
mov AL, 00000100b;
out 60h, AL;
mov BX, [ES:SI];
mov DX, BX;
add DX, 18;
@W2:
mov BX, [ES:SI];
cmp BX, DX;
jb @W2;
@CHK5: // 3-й цикл
in AL, 64h;
and AL, 00000010b;
jnz @CHK5;
mov AL, 11101101b;
out 60h, AL;
@CHK6:
in AL, 64h;
and AL, 00000010b;
jnz @CHK6;
mov AL, 00000001b;
out 60h, AL;
mov BX, [ES:SI];
mov DX, BX;
add DX, 18;
@W3:
mov BX, [ES:SI];
cmp BX, DX;
jb @W3; //Конец циклов, которые нужно сократить
dec CL;
jnz @PRG;
@CHK7:
in AL, 64h;
and AL, 00000010b;
jnz @CHK7;
mov AL, 11101101b;
out 60h, AL;
@CHK8:
in AL, 64h;
and AL, 00000010b;
jnz @CHK8;
mov AL, 00000010b;
out 60h, AL;
end;
end.
В коде есть 3 одинаковых цикла, в которых поочередно меняется только одна строка:
mov AL, 00000010b;
mov AL, 00000100b;
mov AL, 00000001b;
Эту часть кода аццкий препод попросил сократить и сделать один цикл вместо трех, где одна единственная строка, которая меняется, менялась бы с помощью деления или сдвига вправо.
>> №434  

Я бы помог, но мне очень лениво. Вот тебе немножко доков:
│0edH Turn LED 'lock key' lights on or off. First send 0edH, then send byte:
│ ╓7┬6┬5┬4┬3┬2┬1┬0╖
│ ║ not used│c│n│s║
│ ╙─┴─┴─┴─┴─┴╥┴╥┴╥╜
│ ║ ║ ╚═► ScrollLock light 01H=turn on
│ ║ ╚═══► NumLock light 02H=turn on
│ ╚═════► CapsLock light 04H=turn on

│ The bit positions 0-3 correspond to bits 4-6 of the keyboard flags
│ variable in the BIOS Data Area. You should make an effort to keep the
│ flags in sync with the lights. For instance, if you do a big favor for
│ the user and set his ten-key pad into NumLock mode (by setting bit 5 of
│ 0:0417) then be sure to turn on the corresponding LED (e.g., bit 1).

>> №435  

>>434
чортовы пробелы

>> №436  

org 100h
mov word[counter],182
cli
xor ax,ax
push ax
pop ss
mov sp,8h*4 ;INT 08h (уёбываем таймер, он тикнет 182 раза за 10 секунд)

;запоминаем таймер
pop di
pop si
;запоминаем клаву
pop bx ; bx = old IP
pop es ; es = old CS

;устанавливаем свой
push cs ;сегмент
push noklav ;и смещение
push cs ;и для
push timer ;таймера
sti

mov [oldtimr],di
mov [oldtimr+2],si

mov cx,word[cs:counter]
test cx,cx ;ну ты понял
jnz $-6

cli
mov sp,9h*4+4 ;восстанавливаем
push es ;и прерывание
push bx ;клавы
push si ;и таймер
push di ;тоже
sti
int 20h

noklav:
pushf
popf
iret

timer:
pushf
call far dword[cs:oldtimr]
dec word[ds:counter]
iret

counter dw 182
oldtimr dw 0,0

алсо, используй fasm. а еще не пытайся запускать это в отладчике.

>> №437  

БЛДЖАД, это не то!
перепутал с тредом в /b/
436-кун

>> №438  

вот, с LED-ами

org 100h
cli
xor ax,ax
push ax
pop ss
mov sp,8h*4

pop di
pop si

push cs
push timer
sti

mov [oldtimr],di
mov [oldtimr+2],si

mov cx,word[cs:counter]
test cx,cx ;ну ты понял
jnz $-6

cli
mov sp,8h*4+4 ;восстанавливаем
push si ;и таймер
push di ;тоже
sti
int 20h

timer:
pushf
call far dword[cs:oldtimr]

mov al,0EDh
out 64h,al
mov al,byte[x]
out 64h,al
shl al,1
and al,7
test al,al
jnz good
inc al
good:
mov byte[x],al

dec word[ds:counter]
iret

counter dw 30
oldtimr dw 0,0
x db 1

>> №439  

>>438

За такой код надо ебать кочергой.

>> №443  

>>439
поцчиму?



Удалить пост []
Пароль
[a / aa / ad / au / b / bg / bo / c / d / dg / di / ew / f / fa / fd / fg / fi / fl / g / gg / h / ho / hr / ja / k / ls / m / ma / me / mo / mu / n / ne / o / p / pa / ph / pr / r / re / rf / s / sp / t / td / tr / tv / u / vg / w / wh / wm / wp / y] - [Главная] [Manage]