0 / 0 / 0
Регистрация: 01.04.2013
Сообщений: 117
1

Дан вектор X(x1,x2,.,x10). Найти количество и сумму нечетных отрицательных элементов вектора

02.06.2015, 12:24. Показов 2343. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дан вектор X(x1,x2,.,x10). Найти количество и сумму нечетных отрицательных элементов вектора
Прошу помочь написать на ТАСМе...Код на Паскале есть:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
program z8;
uses crt;
var a:array[1..10] of shortint;
i,k,n:byte;
s:integer;
begin
clrscr;
randomize;
write('Vvedi razmernost massiva=');
readln(n);
for i:=1 to n do begin
a[i]:=random(100--100+1)+-100;
write(a[i]:4);
if (a[i]<0 )and(odd(a[i])) then begin
    s:=s+a[i];k:=k+1;
        end;
writeln;
writeln('Сумма отрицательных элементов равна ',s);
writeln('Кол-во нечётных элементов равно ',k);
readkey
end.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2015, 12:24
Ответы с готовыми решениями:

Найти количество отрицательных нечетных элементов матрицы на побочной диагонали
Дана квадратная матрица А размерности nxn. Найти количество отрицательных нечетных элементов...

Дан массив из 5 элементов. Найти количество отрицательных элементов
Дан массив из 5 элементов a db 12,31,10,15,5. Найти количество отрицательных элементов.

Дан массив элементов длины N. Найти сумму нечетных отрицательных элементов
В одном из вариантов попался данная задача. Помогите с данной задачкой. (Pascal ABC) Вопрос:...

В одномерном целочисленном массиве найти сумму элементов, количество нечетных отрицательных элементов
Дан одномерный массив целых чисел A размера N=7. Найти и вывести а) сумму его элементов б)...

22
3405 / 1824 / 489
Регистрация: 28.02.2015
Сообщений: 3,699
02.06.2015, 16:50 2
Выложите описание mac.lib
0
0 / 0 / 0
Регистрация: 01.04.2013
Сообщений: 117
02.06.2015, 17:17  [ТС] 3
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Выложите описание mac.lib
гм..так пойдет?
Вложения
Тип файла: rar MAC.rar (7.8 Кб, 4 просмотров)
0
3405 / 1824 / 489
Регистрация: 28.02.2015
Сообщений: 3,699
02.06.2015, 20:47 4
Dimer-23
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
model   tiny
.code
%nolist
;include    mac.inc
%list
n   equ 10
org 100h
start:  lea dx,dbArray
    mov ah,9
    int 21h
    call    randomize
    mov cx,n    
    lea di,dbData
    xor si,si
    xor dx,dx
    cld
@@01:   call    generator
;   mov ax,cx
;   sub ax,7
    stosb
    and ax,0ffh
    or  al,al   
    jns @@02
    push    ax
    shr ax,1
    pop ax
    jnc @@02
    add si,ax
    inc dx
@@02:   call    outInt
    loop    @@01
    push    dx
    push    si
    lea dx,dbSumma
    mov ah,9
    int 21h
    pop ax
    call    outInt
    lea dx,dbCount
    mov ah,9
    int 21h
    pop ax
    call    outInt
    xor ax,ax
    int 16h
    ret
generator:
;   rand    100
    call    rand
    push    ax
;   rand    100 
    call    rand
    pop bx
    sub ax,bx
    ret
outInt: push    di
    push    si
    push    dx
    push    cx
    push    bx
    cbw
    mov bl,' '
    or  ax,ax
    jns @@03
    mov bl,'-'
    not ax
    inc ax
@@03:   mov si,10
    xor cx,cx
@@04:   xor dx,dx
    div si
    or  dl,'0'
    push    dx
    inc cx
    or  ax,ax
    jnz @@04
@@05:   push    bx
    inc cx
    mov bl,' '
    cmp cx,6
    jnz @@05
@@06:   pop ax
    int 29h
    loop    @@06
    pop bx
    pop cx
    pop dx
    pop si
    pop di
    ret
randomize:
    xor ax,ax
    int 1ah
    add cx,dx
    mov r_c,cx
    ret
rand:   push    dx
    mov ax,r_c
    mul word ptr r_a
    div word ptr r_b
    mov r_c,dx
    mov ax,dx
    pop dx
    ret
dbArray db  10,13,'Array:$'
dbSumma db  10,13,'Summa:$'
dbCount db  10,13,'Count:$'
r_A dw  579Bh
r_B dw  7FFFh
r_C dw  ?
dbData  db  n dup(?)
    end start
макрос rand из LIB'a никуда не годится, поэтому переделал по своему
Сам посебе массив не нужен, т.к. он больше нигде не используется.
0
0 / 0 / 0
Регистрация: 01.04.2013
Сообщений: 117
03.06.2015, 05:09  [ТС] 5
О блин А я преподу не смогу внятно объяснить откуда я так умею и зачем я сделал не "по нашенски"
0
3405 / 1824 / 489
Регистрация: 28.02.2015
Сообщений: 3,699
03.06.2015, 06:52 6
Цитата Сообщение от Dimer-23 Посмотреть сообщение
А я преподу не смогу внятно объяснить откуда я так умею
Похожий код есть к примеру у С. Зубкова. А фраза "книгу почитал" будет проглочена преподом на ура.
Цитата Сообщение от Dimer-23 Посмотреть сообщение
зачем я сделал не "по нашенски"
Функция 1А/0 изменяет свое значение 18,2 раза в секунду, другими словами из трех соседних вызовов - два дадут одинаковый результат, а это уже не случайно. И если быть точнее, то с использованием макроса rand 100 генерировалось только два числа: начальная часть массива заполнялась одним, остальное другим.
0
0 / 0 / 0
Регистрация: 01.04.2013
Сообщений: 117
03.06.2015, 07:44  [ТС] 7
Цитата Сообщение от Constantin Cat Посмотреть сообщение
А фраза "книгу почитал" будет проглочена преподом на ура.
Спасибо Вам огромное за помощь Отправил код по почте преподавательнице...Забрила сразу Хорошо, грит, но это самодеятельность, и грит не вынуждайте меня задавать вам 5-10 вопросов по хитрой реализации кода и книге из которой вы это взяли... Делайте мол вот так и продолжайте код...и накидала мне стандартную процедуру ввода из методички
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
%nolist
    include mac.lib
%list
 
 
 
A_Stack segment  Stack  `стек`
              DW          256     dup (0)
A_STACK    ENDS.
 
A_Data   segment
         A          dw    10  dup(?)
         S          dw   ?
         K          dw   ?
      Mes1  db    10,13,  ’введите элемент массива  $’
    Meser    db  10,13, ’   Ошибка ввода. Повторите!  ‘,10,  13,$’  
      Mes2  db     10,13,  ’ Массив введен  $’
 
A_Data    Ends  
 
A_Code Segment PARA PABLIC
     Assume   DS: A_Data,  SS: A_Stack, CS; A_Code
 START: ; подготовка к циклу
              mov  cx, 10            ; число элементов массива.
              mov  di, 0                   ;  i: = 1   
 CIKL:   lea dx, mes1  
               mov  ah,9h
               int 21h
 ;     макрос ввода с клавиатуры 
        Key_$2bin     ;   ввод числа со знаком в регистр ax.
        Jnc  good   
        Lea dx, meser
        Mov  ah,9h
         Int 21h     
        Jmp     cikl                 
       Good: Mov  А[DI], ax    ; AX-> A[i]
  ;   переадресация 
                ADD  DI, 2                 ; i: = i + 1
until:         dec cx                       ; cx=cx-1
                 jz     final                   ; при  cx=0  на метку  final
              jmp   CIKL;  если   CX не 0 , то   безусловный  переход  на метку  CIKL
final:   lea dx,mes2
           mov  ah,9h
              int 21h
;  exit;
       Mov      ah, 4ch
       Int 21h
A_Code  ends
End   start
0
3405 / 1824 / 489
Регистрация: 28.02.2015
Сообщений: 3,699
03.06.2015, 08:05 8
Assembler
1
2
3
4
5
6
       Good: Mov  А[DI], ax    ; AX-> A[i]
  ;   переадресация 
                ADD  DI, 2                 ; i: = i + 1
until:         dec cx                       ; cx=cx-1
                 jz     final                   ; при  cx=0  на метку  final
              jmp   CIKL;
Строковые команды заменяют две строчки, ну да ладно с ними. Дальше вообще "чудисато". Незнание, что есть LOOP или в худшем случае JNZ.

И причем тут ввод, если в задании генератор чисел?
0
0 / 0 / 0
Регистрация: 01.04.2013
Сообщений: 117
03.06.2015, 08:15  [ТС] 9
Следом отписалась - "Могу дать вам шпаргалку. Высылаю пример с готовой работы вашего сокурсника, он сдал на 4ку, воспользуйтесь и переделайте под свое задание " Вот код из присланного ей файла асм-
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
%nolist
include mac.lib
%list
 
data segment para
X   dw  16 dup(?)
b   dw  ?
s   dw  ?
mes0    db  10,13, 'Цыбеногруппа ЭВМз, вариант 17, лабораторная работа №4 $'
mes1    db  10,13, 'Введите элемент вектора - $'   
mes2    db  10,13, 'Вектор введен$'
mes_err db  10,13, 'Введено некорректное число. Попробуйте снова $'
mes3    db  10,13, 'X[16] = $'
mes4    db  10,13, 'Введите число B =  $'
mes5    db  10,13, 'Количество элементов, равных числу В, равно = $'
data ends
 
stk segment para
db 256 dup(?)
stk ends
 
code segment para
assume ds:data, ss:stk, cs:code
 
vvodmas proc
m1: key_$2bin
    jnc m2  ; проверка является ли введённое число корректным, если ДА, то идём дальше
    message mes_err ; если НЕТ - требуем повторить ввод
    jmp m1  ; переходим на метку м1
m2: ret
vvodmas endp
 
srav proc
    mov     ax, x[di] ; заносим элемент вектора в аккумулятор
    cmp ax, b   ; сравниваем его с нашим числом
    jne m3  ; если не равно, уходи из процедуры
    inc s   ; иначе увеличиваем сумму на единицу 
m3: ret     ; возвращение в программу
srav endp
 
print proc
    mov di, 0
    mov cx, 16
printmas: mov ax,[bx]+[di]
    print_number
    add di, 2
    dec cx 
    cmp cx, 0
    je  m4
    jmp printmas 
m4: ret
print endp
 
start:  mov ax, data
    mov ds, ax  ; инициализация ds выполнена
    message mes0    ; Вывод на экран заголовка
    mov di, 0   ; задаем первый элемент вектора
    mov cx, 16  ; задаем количество итераций цикла
cycle:  mov ah, 9h
    lea dx, mes1
    int 21h     ; вывод сообщения 
    call vvodmas    ; вызов процедуры ввода элемента вектора
    mov x[di], ax ; заносим элемент в память
    add di, 2   ; i: = i + 1
    loop cycle  ; идем опять в цикл
    message mes2
    message mes3
    call print
    mov ah, 9h
    lea dx, mes4
    int 21h     ; вывод сообщения
    key_$2bin
    mov b, ax   ; заносим введенное число в b
    mov di, 0   ; переходим к первому элементу вектора
    mov s, di   ; обнулили сумму
    mov cx, 16  ; задали значение счетчика циклов
cycle2: call srav
    add di, 2   ; выбираем следующий элемент вектора
    loop cycle2 ; возвращаемся в цикл
    mov ax, s
    message mes5
    print_number        
    
    mov ax, 4C00h
    int 21h
code ends
end start
0
3405 / 1824 / 489
Регистрация: 28.02.2015
Сообщений: 3,699
03.06.2015, 08:51 10
И как теперь выглядит задание?
0
0 / 0 / 0
Регистрация: 01.04.2013
Сообщений: 117
03.06.2015, 09:58  [ТС] 11
Цитата Сообщение от Constantin Cat Посмотреть сообщение
И как теперь выглядит задание?
)) Так же)) Задание то не изменилось...
Дан вектор X(x1,x2,.,x10). Найти количество и сумму нечетных отрицательных элементов вектора
0
6681 / 2664 / 366
Регистрация: 17.02.2013
Сообщений: 3,906
03.06.2015, 10:46 12
Цитата Сообщение от Dimer-23 Посмотреть сообщение
until: dec cx ; cx=cx-1
jz final ; при cx=0 на метку final
jmp CIKL; если CX не 0 , то безусловный переход на метку CIKL
final:
Точно. Вот это вот все заменяется на одну команду
loop CIKL
Но ... не занимайтесь самодеятельностью
1
0 / 0 / 0
Регистрация: 01.04.2013
Сообщений: 117
03.06.2015, 10:55  [ТС] 13
Цитата Сообщение от Ethereal Посмотреть сообщение
Вот это вот все заменяется на одну команду
loop CIKL
Да, согласен. В присланной преподом шпаргалке loop применяется, так что не вижу причин его не использовать))
0
6681 / 2664 / 366
Регистрация: 17.02.2013
Сообщений: 3,906
03.06.2015, 13:02 14
А вот так будет выглядеть злостная и неисправимая самодеятельность
с отягчающими вину обстоятельствами. Преподавательница от такого
кода наверное выпадет в ступор. Я тут выдал немного экстрима.
Компилировать как COM-программу.
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
    ;TASM COM-program
    Model   Tiny
    .Code
    Org 100h
 
Start:
    xor bp, bp      ;Сумма отрицательных нечетных <- 0
    xor di, di      ;Кол-во отрицательных нечетных <- 0
    mov si, offset X    ;Адрес массива
    mov cx, 10      ;Число элементов в массиве
;;;;;;;;;;;;;;;;;;;;;;;;;
    mov dx, 8001h
    cld
@:  lodsw
    mov bx, ax
    and bx, dx
    cmp bx, dx
    sbb bx, bx
    not bx
    and ax, bx
    add bp, ax      ;Считается сумма отрицательных нечетных
    sub di, bx      ;Считается кол-во отрицательных нечетных
    loop    @       ;cx<-0
;;;;;;;;;;;;;;;;;;;;;;;;;
    mov dx, offset tSumma
    call    Print
    mov ax, bp
    call    OutInt
    mov dx, offset tKolvo
    call    Print
    mov ax, di
OutInt: ;xor    cx, cx      ;тут итак cx=0
    mov bx, 10
@@: cwd
    idiv    bx
    inc cx
    test    dx, dx      ;c<-0
    jns @@@
    neg dx      ;s=1 => dx<>0 => c<-1
@@@:    push    dx
    inc ax      ;c<-c
    dec ax      ;c<-c
    jnz @@
    jnc @@@@
    mov al, '-'-'0'
    push    ax
    inc cx
@@@@:   pop dx
    add dl, '0'
    mov ah, 2
    int 21h
    loop    @@@@        ;cx<-0
    ret
 
Print:  mov ah, 9
    int 21h
    ret
 
tSumma  db  'Summa: $'
tKolvo  db  13,10,'Kolvo: $'
 
X   dw  1,-1,2,-2,3,-3,4,-4,5,-5    ;Массив с данными
 
    End Start
Хотя можно еще заморочнее. Но тут просто что в голову пришло.

Добавлено через 8 минут
А вообще если тупорыло и прямолинейно ядро твоей программы должно содержать
что-то типа
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    lea bx, massiv  ;Массив слов
    mov cx, 10      ;Длина массива в словах
cykl:   mov ax, [bx]
    test    ax, 1       ;Нечетное ?
    jz  ne_to
    test    ax, ax      ;Отрицательное ?
    jns ne_to
    add summa, ax   ;Добавили к сумме
    inc kolvo       ;Увеличили на 1 количество
ne_to:  add bx, 2
    loop    cykl
 
...
 
summa   dw  0
kolvo   dw  0
massiv  dw  10 dup (?)  ;Или вводи с клавы или заполни константами
А все остальное - обрамление этого. Его можно содрать со шпаргалки.
1
0 / 0 / 0
Регистрация: 01.04.2013
Сообщений: 117
04.06.2015, 07:07  [ТС] 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
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
%nolist
include mac.lib
%list
 
data segment para
X   dw  10 dup(?)
s   dw  ?       ; Cумма элементов
k   dw  0       ; количество элементов
dva dw      2
mes0    db  10,13, 'Zadanie    '
mes1    db  10,13, 'Vvedite x[i]=$' 
mes2    db  10,13, 'Vektor vveden  $'
mes_err db  10,13, 'Error! Vvodite  cifri   $'
mes3    db  10,13, 'X[10] = $'
mes4    db  10,13, 'kolichestvo otricatelnih nech-x elementov =  $'
mes5    db  10,13, 'summa otricatelnih nech-x elementov= $'
data ends
 
stk segment para
db 256 dup(?)
stk ends
 
code segment para
assume ds:data, ss:stk, cs:code
 
vvodmas proc
m1: key_$2bin
    jnc m2  ; проверка является ли введённое число корректным, если ДА, то идём дальше
    message mes_err ; если НЕТ - требуем повторить ввод
    jmp m1  ; переходим на метку м1
m2: ret
vvodmas endp
 
kol_el proc
    mov     ax, x[di] ; заносим элемент вектора в аккумулятор
        
    cmp ax, 0     ; сравниваем c 0 
    jg  m3    ; если не равно, уходим из процедуры
    cwd 
    idiv dva
    cmp dx, 0
    JE m3   
;    иначе
    inc k     ;  увеличиваем k на 1 
        mov ax,x[di]
        add s,ax      ;    увеличиваем сумму на x[di] 
m3: ret       ; возвращение в программу
kol_el endp
 
print proc
    mov di, 0
    mov cx, 10
printmas: mov ax,[bx]+[di]
    print_number
    add di, 2
    dec cx 
    cmp cx, 0
    je  m4
    jmp printmas 
m4: ret
print endp
 
start:  mov ax, data
    mov ds, ax  ; инициализация ds выполнена
 
    message mes0    ; Вывод на экран заголовка
    mov di,  0  ; задаем первый элемент вектора
    mov cx, 10  ; задаем количество итераций цикла
cycle:  mov ah, 9h
    lea dx, mes1
    int 21h     ; вывод сообщения 
    call vvodmas    ; вызов процедуры ввода элемента вектора
    mov x[di], ax ; заносим элемент в память
    add di, 2   ; i: = i + 1
    loop cycle  ; идем опять в цикл
        
    message mes2
        crlf
    message mes3
    call print
    ;mov    ah, 9h
    ;lea    dx, mes4
    ;int 21h        ; вывод сообщения
    ;key_$2bin
    ;mov    b, ax   ; заносим введенное число в b
 
    mov di, 0   ; переходим к первому элементу вектора
    mov s, di   ; обнулили сумму
    mov cx, 10  ; задали значение счетчика циклов
cycle2: call kol_el
    add di, 2   ; выбираем следующий элемент вектора
    loop cycle2 ; возвращаемся в цикл
 
        message mes4
    mov ax, k
    print_number
        message mes5
    mov ax, s
    print_number
        inkey       
    
    mov ax, 4C00h
    int 21h
code ends
end start
0
6681 / 2664 / 366
Регистрация: 17.02.2013
Сообщений: 3,906
04.06.2015, 12:45 16
Лучший ответ Сообщение было отмечено Dimer-23 как решение

Решение

Цитата Сообщение от Dimer-23 Посмотреть сообщение
printmas: mov ax,[bx]+[di]
Тут у тебя bx неизвестно чему равно. Замени на
mov ax,X[di]

Добавлено через 2 минуты
Цитата Сообщение от Dimer-23 Посмотреть сообщение
jg m3 ; если не равно, уходим из процедуры
Ноль тоже относится к положительным числам. Поэтому
jge m3

Добавлено через 3 минуты
Цитата Сообщение от Dimer-23 Посмотреть сообщение
mes0 db 10,13, 'Zadanie '
Поставь доллар на конце строки
2
0 / 0 / 0
Регистрация: 01.04.2013
Сообщений: 117
04.06.2015, 16:19  [ТС] 17
Огромное спасибо!!
Единственный маленький вопрос - почему то стал ответ выводиться СВЕРХУ экрана..
Миниатюры
Дан вектор X(x1,x2,.,x10). Найти количество и сумму нечетных отрицательных элементов  вектора  
0
6681 / 2664 / 366
Регистрация: 17.02.2013
Сообщений: 3,906
04.06.2015, 23:01 18
Я вот этот
Цитата Сообщение от Dimer-23 Посмотреть сообщение
include mac.lib
в глаза не видел, но очевидно, что вот это
Цитата Сообщение от Dimer-23 Посмотреть сообщение
crlf
как-то перемещает курсор вверх.
Покажи как этот макрос crlf выглядит в файле mac.lib
1
3405 / 1824 / 489
Регистрация: 28.02.2015
Сообщений: 3,699
05.06.2015, 00:43 19
Ethereal
Смотрите пост №3, под либом простой инклуд.
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
;;      приостанов на заданное время
;;      вход:могут быть указаны минуты,секунды,cотые доли секунды
;;      пример:  delay ,30,50
delay   macro   minutes,seconds,hundred
        local   secs,mins,hrs,check,quit
        PUSH_REGS   <ax,bx,cx,dx>
        READ_TIME   ;;считать текущее время
        mov     ah,ch
        mov     al,cl
        mov     bh,dh
        mov     bl,dl
        add     al,minutes
        add     bh,seconds
        add     bl,hundred
        cmp     bl,100
        jb      secs
        sub     bl,100
        inc     bh
secs:   cmp     bh,60
        jb      mins
        sub     bh,60
        inc     al
mins:   cmp     al,60
        jb      hrs
        sub     al,60
        inc     ah
hrs:    cmp     ah,24
        jne     check
        sub     ah,ah
check:  READ_TIME
        cmp     cx,ax
        ja      quit
        jb      check
        cmp     dx,bx
        jb      check
quit:   pop_REGS    <dx,cx,bx,ax>
        endm
;;      сохранение регистров в стеке
;;      вход:список имен регистров через запятую в угловых скобках
;;      пример:  push_regs <ax,bx,dx>
push_REGS   macro   regl
        irp     req,<regl>
        push    req
        endm
        endm
;;      извлечение из стека значений регистров
;;      вход:   список регистров через запятую в угловых скобках
;;      пример: pop_regs  <dx,bx,ax>
pop_REGS    macro   regl
        irp     req,<regl>
        pop     req
        endm
        endm
;;      генерация случайного числа в интервале от 0 до предел
;;      вход: предел (от 4 до 127)
;;      выход:(al)=случайное число
;;      пример: rand 85
rand    macro   limit
        local   strip
        push_REGS   <cx,dx,ax>
        mov     ah,0
        int     1ah     ;;считать показания таймера
        mov     ax,dx
        mov     cl,limit
        mov     dh,3fh
        cmp     cl,64
        jae     strip
        shr     dh,1    ;;если limit<64,удалить 3 бита
        cmp     cl,32
        jae     strip
        shr     dh,1    ;;если limit<32,удалить 4 бита
        cmp     cl,16
        jae     strip
        shr     dh,1    ;;если limit<16,удалить 5 битов
        cmp     cl,0
        jae     strip
        shr     dh,1    ;;если limit<8,удалить 6 битов
strip:  and     ah,dh
        div     cl
        mov     al,ah
        pop     cx
        mov     ah,ch
        pop_REGS    <dx,cx>
        endm
;;      преобразование строки символов из сегмента данных в число со знаком
;;      вход:строка,первый символ которой-длина строки(всего<=7)
;;      выход:если строка допустима,cf=0 и (ax)=число
;;            если строка недопустима,то cf=1
;;      пример: $2bin str, где str   db   6,-16540
$2BIN  macro   strn
        local   blanks,chkn,chkp,goc,good,nogood,thru
        local   conva,range,nondig,digit,endc,skipit
        push_REGS   <bx,cx>
        sub     ax,ax
        sub     ch,ch
        mov     cl,strn
        lea     bx,strn+1
blanks: cmp     byte ptr [bx],' '
        jne     chkn
        inc     bx
        loop    blanks
chkn:   cmp     byte ptr [bx],'-'
        jne     chkp
        inc     bx
        dec     cx
        call    conva
        jc      thru
        cmp     ax,32768
        ja      nogood
        neg     ax
        js      good
chkp:   cmp     byte ptr [bx],'+'
        jne     goc
        inc     bx
        dec     cx
goc:    call    conva
        jc   thru
        cmp     ax,32767
        ja      nogood
good:   clc
        jnc     thru
nogood: stc
thru:   pop_REGS    <cx,bx>
        jmp     skipit
conva   proc
        push_REGS   <bp,bx,si>
        mov     bp,bx
        sub     bx,bx
range:  cmp     byte ptr ds:[bp],'0'
        jb      nondig
        cmp     byte ptr ds:[bp],'9'
        jbe     digit
nondig: stc
        jc      endc
digit:  mov     si,10
        push    dx
        mul     si
        pop     dx
        mov     bl,ds:[bp]
        and     bx,0fh
        add     ax,bx
        jc      endc
        inc     bp
        loop    range
        clc
endc:   pop_REGS    <si,bx,bp>
        ret
conva   endp
skipit: nop
        endm
;;      преобразование содержимого регистра ах-числа со знаком-в строку символов
;;      в сегменте данных
;;      вход: имя строки указывает на начальный адрес строки в 7 байт
;;      пример:  bin2$ ms ,где ms db 7 dup(7)
BIN2$  macro   strn
        local   fillb,clrd,nomore
        push_REGS   <dx,cx,bx,si,ax>
        lea     bx,strn
        mov     cx,6
fillb:  mov     byte ptr [bx],' '
        inc     bx
        loop    fillb
        mov     si,10
        or      ax,ax
        jns     clrd
        neg     ax
clrd:   sub     dx,dx
        div     si
        add     dx,'0'
        dec     bx
        mov     [bx],dl
        or      ax,ax
        jnz     clrd
        pop     ax
        or      ax,ax
        jns     nomore
        dec     bx
        mov     byte ptr [bx],'-'
nomore: mov     strn,6
        pop_REGS    <si,bx,cx,dx>
        endm
;;      преобразование символов,набранных на клавиатуре,в число со знаком в ах
;;      выход:если последовательность допустима,то cf=0 и (ах)=число
;;            если недопустима,то cf=1
;;      пример: key_$2bin
key_$2bin  macro
        local   temp,save
        jmp     save
temp    db      7,8 dup(?)
save:   push_REGS   <ds,cx>
        mov     cx,cs
        mov     ds,cx
        in$     temp    ;;ввод строки в буфер temp
        $2BIN  temp+1
        pop_REGS    <cx,ds>
        endm
;;      очистка экрана
;;      пример:   cls
cls     macro
        push_REGS   <ax,bx,cx,dx>
        mov     cx,0
        mov     dh,24
        mov     dl,79
        mov     ah,6
        mov     al,0
        mov     bh,7
        int     10h
        pop_REGS    <dx,cx,bx,ax>
        endm
;;      перемещение курсора к началу текущей строки
;;      пример : cr
cr      macro
        push_REGS   <cx,dx>
        pos     ;;n строки->dh
        sub     dl,dl
        move_cursor   ;;переместить курсор
        pop_REGS    <dx,cx>
        endm
;;      перемещение курсора к началу следующей строки
;;      пример  :crlf
crlf    macro
        cr
        lf
        endm
;;      перемещение курсора в левый верхний угол экрана
;;      пример :home
home    macro
        locate  0,0
        endm
;;      переход к новой строке
;;      пример:  lf
lf      macro
        push_REGS   <cx,dx>
        pos
        inc     dh
        move_cursor
        pop_REGS    <dx,cx>
        endm
;;      перемещение курсора в указанную позицию
;;      вход:  cтрока(от 0 до 24) и столбец (от 0 до 79)
;;      пример :locate 24,79
locate  macro   row,col
        push    dx
        mov     dh,row
        mov     dl,col
        move_cursor
        pop     dx
        endm
;;      перемещение курсора в строку с номером, равным (dh) и в столбец с
;;      номером, равным (dl)
;;      пример : move_cursor
MOVE_CURSOR   macro
        local   ok,vs
        push_REGS   <ax,bx>
        cmp     dh,24
        jna     ok
        sub     dh,dh
ok:     cmp     dl,79
        jna     vs
        sub     dl,dl
vs:     VIDEO_STATE
        mov     ah,2
        int     10h
        pop_REGS    <bx,ax>
        endm
;;      считывание текущей позиции курсора
;;      выход: (dh,dl)=строка,столбец
;;             (ch,cl)=режим изображения курсора
;;      пример: pos
pos     macro
        push_REGS   <ax,bx>
        VIDEO_STATE
        mov     ah,3
        int     10h
        pop_REGS    <bx,ax>
        endm
;;      перемещение курсора в указанный столбец
;;      вход: столбец(от 0 до 79)
;;      пример: tab 40
tab     macro   col
        local   dot,getb
        push_REGS   <ax,bx,cx,dx>
        pos
        cmp     dl,col
        jbe     dot
        lf
        pos
dot:    mov     dl,col
        cmp     dl,79
        jna     getb
        mov     dl,79
getb:   VIDEO_STATE
        mov     ah,2
        int     10h
        pop_REGS    <dx,cx,bx,ax>
        endm
;;      изображение на экране строки симвлолв из сегмента данных
;;      вход: имя строки; строка должна оканчиваться символом $
;;      пример: message ill ,где ill db 'ошибка$'
MESSAGE    macro   strn
        push    dx
        lea     dx,ds:strn
        MESSAGE_DX
        pop  dx
        endm
;;      изображение на экране строки символов из сегмента данных, смещение
;;      которой содержится в регистре dx
;;      пример: lea  dx,ill
;;              message_dx
MESSAGE_DX  macro
        push    ax
        mov     ah,9
        int     21h
        pop     ax
        endm
0
3405 / 1824 / 489
Регистрация: 28.02.2015
Сообщений: 3,699
05.06.2015, 00:44 20
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
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
;;      изображение на экране символа, хранящегося в регистре al,и перемещение
;;      курсора на одну позицию
;;      пример: mov  al,'p'
;;              print_al
PRINT_AL   macro
        push_REGS   <ax,bx,cx,ax>
        VIDEO_STATE
        pop     ax
        mov     cx,1
        mov     ah,14
        int     10h
        pop_REGS    <cx,bx,ax>
        endm
;;      изображение на экране числа со знаком из регистра ах
;;      пример: print_number
PRINT_NUMBER    macro
        local   temp,save
        jmp     save
temp   db      7 dup(?)
save:   PUSH_REGS   <ds,cx>
        mov     cx,cs
        mov     ds,cx
        BIN2$  temp
        PRINT$     temp
        POP_REGS    <cx,ds>
        endm
;;      изображение на экране строки символов из сегмента данных
;;      вход: имя строки, первый байт которой-число символов
;;      пример: print$ ss , где ss db 6,'ddffgg'
PRINT$     macro   strn
        push    dx
        lea     dx,strn
        PRINT$_DX
        pop     dx
        endm
;;      изображение на экране строки символов из сегиента данных,
;;      смещение которого -в регистре dx.формат строки-такой же, как для print$
;;      пример : print$_dx
PRINT$_DX   macro
        local   strip,nextc,nobl
        push_REGS   <ax,cx,si>
        sub     cx,cx
        mov     si,dx
        mov     si,dx
        mov     cl,[si]
        inc     si
strip:  lodsb
        cmp     al,' '
        jne     nobl
        loop    strip
nextc:  lodsb
nobl:   PRINT_AL
        loop    nextc
        pop_REGS    <si,cx,ax>
        endm
;;      изображение символа из регистра al без перемещения курсора
;;      пример: mov al,'p'
;;              show_al
show_al  macro
        push_REGS   <ax,bx,cx,ax>
        VIDEO_STATE
        pop     ax
        mov     cx,1
        mov     ah,10
        int     10h
        pop_REGS    <cx,bx,ax>
        endm
;;      возвращение режима изображения
;;      выход: (al)=текущий режим
;;             (ah)=число столбцов на экране
;;             (bh)=номер активной страницы
;;      пример: video_state
VIDEO_STATE  macro
        mov     ah,15
        int     10h
        endm
;;      ввод введенного символа в регистр al и отображение его на экране
;;      пример: inkey
INKEY   macro
        push    cx
        push    ax
        mov     ah,1
        int     21h
        pop     cx
        mov     ah,ch
        pop     cx
        endm
;;      ввод введенного символа в регистр al без отображения на экране
;;      пример: inkey_i
INKEY_I  macro
        push_REGS   <cx,ax>
        mov     ah,8
        int     21h
        pop     cx
        mov     ah,ch
        pop     cx
        endm
;;      ввод символов с клавиатуры в буфер в сегменте данных
;;      вход: имя=имя буфера; буфер должен быть на 3 байта длиннее
;;            помещаемой строки (1-ый байт-максимальная длина+1)
;;      выход: фактическая длина строки во 2-ом байте буфера
;;      пример: in$ buf  ,где buf db 11,12 dup(?)-вводится не более 10 символов
IN$     macro   strn
        push    dx
        lea     dx,strn
        IN$_DX
        pop     dx
        endm
;;      ввод символов с клавиатуры в буфер в сегменте данных
;;      вход: (ds:dx)=начальному адресу буфера(его формат такой же,как и для ins)
;;      выход: такой же,как у ins
;;      пример :lea  dx,buf
;;              in$_dx
IN$_DX   macro
        push    ax
        mov     ah,0ah
        int     21h
        pop     ax
        endm
;;      выдача звука заданной частоты и длительности
;;      вход: частота в гц (от 21 до 65535) и длительность в сотых долях секунды
;;             (от 0 до 65535)
;;      пример: sound 262,100
SOUND   macro   fr,dur
        mov     di,fr
        mov     bx,dur
        SOUND_DL_BX
        endm
;;      выдача звука,частота которого в di,а длительность-в bx
;;      пример: mov  di,262
;;              mov  bx,100
;;              sound_dl_bx
SOUND_DL_BX macro
        local   wait,spk
        push_REGS   <ax,bx,cx,dx,di>
        mov     al,0b6h
        out     43h,al
        mov     dx,14h
        mov     ax,4f38h
        div     di
        out     42h,al
        mov     al,ah
        out     42h,al
        in      al,61h
        mov     ah,al
        or      al,3
        out     61h,al
wait:   mov     cx,2801
spk:    loop    spk
        dec     bx
        jnz     wait
        mov     al,ah
        out     61h,al
        pop_REGS    <di,dx,cx,bx,ax>
        endm
;;      чтение текущего времени
;;      выход :(ch)= часы;(cl)=минуты;(dh)=секунды;(dl)=сотые доли секунд
;;      пример: read_time
READ_TIME   macro
        push    ax
        mov     ah,2ch
        int     21h
        pop     ax
        endm
;;      установка на таймере заданного времени
;;      вход: могут быть заданы часы ,минуты,секунды,сотые доли секунды
;;      опкщенные операнды становятся нулевыми
;;      пример : sett 1,,30 ;задать 1:00:30
sett    macro   hou,min,sec,hsec
        push_REGS   <ax,cx,dx>
        mov     ch,hou
        mov     cl,min
        mov     dh,sec
        mov     dl,hsec
        mov     ah,2dh
        int     21h
        pop_REGS    <dx,cx,ax>
        endm
;;      печать символа
;;      вход:адрес символа
;;      пример: prs s
prs     macro   sim
    push    dx
        mov     dl,sim
        mov     ah,05h
        int     21h
    pop dx
        endm
;;      открытие файла
;;      вход:имя поля БУФ (неоткрытого)
;;      выход: (al)=0,если имя файла найдено в каталоге
;;             (al)=ffh,если имя файла не найдено в каталоге
;;      пример: open bb
open    macro   fcb
    push    dx
        mov     dx,offset fcb
        mov     ah,0fh
        int     21h
    pop dx
        endm
;;      закрытие файла
;;      вход: имя поля открытого БУФ
;;      выход: (al)=0,если имя файла найдено в каталоге
;;             (al)=ffh,если имя файла не найдено в каталоге
;;      пример: close bb
close   macro   fcb
    push    dx
        mov     dx,offset fcb
        mov     ah,10h
        int     21h
    pop dx
        endm
;;      поиск первого входа файла по его имени
;;      вход:имя поля БУФ (неоткрытого)
;;      выход: (al)=0,если имя файла найдено в каталоге
;;             (al)=ffh,если имя файла не найдено в каталоге
;;      пример: searf ss
searf   macro   fcb
    push    dx
        mov     dx,offset fcb
        mov     ah,11h
        int     21h
    pop dx
        endm
;;      поиск дополнительного входа файла по его имени
;;      вход:имя поля БУФ (неоткрытого)
;;      выход: (al)=0,если имя файла найдено в каталоге
;;             (al)=ffh,если имя файла не найдено в каталоге
;;      пример: searn bb
searn   macro   fcb
    push    dx
        mov     dx,offset fcb
        mov     ah,12h
        int     21h
    pop dx
        endm
;;      удаление файла
;;      вход:имя поля БУФ (неоткрытого)
;;      выход: (al)=0,если имя файла найдено в каталоге
;;             (al)=ffh,если имя файла не найдено в каталоге
;;      пример: del bb
del     macro   fcb
    push    dx
        mov     dx,offset fcb
        mov     ah,13h
        int     21h
    pop dx
        endm
;;      последовательное чтение из файла
;;      вход: имя поля БУФ (открытого)
;;      выход: (al)=  00h  чтение завершено успешно
;;                    01h  конец файла
;;                    02h  буфер обмена данными (DTA) слишком мал для записи
;;                    03h  конец файла,неполная запись
;;      пример: readseq ss
readseq macro   fcb
    push    dx
        mov     dx,offset fcb
        mov     ah,14h
        int     21h
    pop dx
        endm
;;      последовательная запись в файл
;;      вход: имя поля БУФ (открытого)
;;      выход: (al)=  00h  запись завершена успешно
;;                    01h  диск переполнен
;;                    02h  буфер обмена данными (DTA) слишком мал для записи
;;      пример: writeseq bb
writeseq macro   fcb
    push    dx
        mov     dx,offset fcb
        mov     ah,15h
        int     21h
    pop dx
        endm
;;      создание файла
;;      вход: имя поля БУФ (открытого)
;;      выход: (al)=  00h  найден пустой(незаполненный справочник)
;;                    ffh  нет доступного пустого справочника
;;      пример: create bb
create  macro   fcb
    push    dx
        mov     dx,offset fcb
        mov     ah,16h
        int     21h
    pop dx
        endm
;;      переименование файла
;;      вход: имя поля БУФ (модифицируемого)
;;      выход: (al)=  00h  найден вход справочника
;;                    ffh  не найден вход справочника
;;      пример: rename bb
rename  macro   fcb
    push    dx
        mov     dx,offset fcb
        mov     ah,17h
        int     21h
    pop dx
        endm
;;      установка адреса буфера для обмена данными с диском
;;      вход: адрес буфера обмена данными с диском
;;      пример: setdta buf
setdta  macro   buf
    push    dx
        mov     dx,offset buf
        mov     ah,1ah
        int     21h
    pop dx
        endm
;;      чтение с диска с прямым доступом
;;      вход: имя поля БУФ (открытого)
;;      выход: (al)=  00h  чтение завершено успешно
;;                    01h  конец файла
;;                    02h  буфер обмена данными (DTA) слишком мал для записи
;;                    03h  конец файла,неполная запись
;;      пример: readdir ss
readdir macro   fcb
    push    dx
        mov     dx,offset fcb
        mov     ah,21h
        int     21h
    pop dx
        endm
;;      запись на диск с прямым доступом
;;      вход: имя поля БУФ (открытого)
;;      выход: (al)=  00h  запись завершена успешно
;;                    01h  диск переполнен
;;                    02h  буфер обмена данными (DTA) слишком мал для записи
;;      пример: writedir ss
writedir macro   fcb
    push    dx
        mov     dx,offset fcb
        mov     ah,22h
        int     21h
    pop dx
        endm
;;      определение количества записей и длины записи
;;      вход:имя поля БУФ (неоткрытого)
;;      выход: (al)=0,если имя файла найдено в каталоге
;;             (al)=ffh,если имя файла не найдено в каталоге
;;      пример: files bb
files   macro   fcb
    push    dx
        mov     dx,offset fcb
        mov     ah,23h
        int     21h
    pop dx
        endm
;;      задание номера записи для прямого доступа
;;      вход: адрес открытого БУФ
;;      пример: numrec bb
numrec  macro   fcb
    push    dx
        mov     dx,offset fcb
        mov     ah,24h
        int     21h
    pop dx
        endm
;;      синтаксический анализ строки на наличие имени файла вида:
;;         дисковод:имя файла.расширение
;;      вход: строка с именем,имя неоткрытого БУФ,байт управления анализом:
;;            -разряды 4-7 - нули
;;            -разряды 0-3 принимают следующие значения:
;;              бит 0  =0 остановить анализ,если встретился разделитель файлов
;;                     =1 игнорировать предыдущие разделители
;;      разделители имени файла:
;;      :.;,=+/"[]\<>| пробел табуляция
;;              бит 1  =0 если в строке нет номера дисковода,установить его в 0
;;                                                         (текущий диск)
;;                     =1 если в строке нет номера дисковода,оставить его в БУФ
;;                                              без изменения
;;              бит 2  =0 если в строке нет имени файла,установить в имени файла
;;                              в БУФ 8 пробелов
;;                     =1 оставить имя файла в БУФ без изменения,если в строке нет
;;                              имени файла
;;              бит 3  =0 если в строке нет расширения,устанвить в расширении
;;                              файла в БУФ 3 пробела
;;                     =1 если в строке нет расширения,то оставить расширение
;;                              имени файла в БУФ без изменения
;;      выход:  (al)=0 нет "диких" символов
;;                  =1 используются "дикие" символы
;;                  =ffh неверная буква дисковода
;;      если в строке в имени файла или в расширении стоит звездочка,то все
;;   оставшиеся символы в имени или в расширении устанавливаются в знак вопроса
;;      пример: parse str,ss,bb
;;              str db 'a:cc'
;;              bb  db  00h
parse   macro   st,fcb,sa
    push_regs <si,di>
        mov     si,offset st
        mov     di,offset fcb
        push_regs  <es,ds>
        pop     es
        mov     al,sa
        mov     ah,29h
        int     21h
    pop es
    pop_regs <di,si>
        endm
;;      выдача адреса буфера для обмена с дисками(DTA)
;;      выход: es:bx -указатель буфера
;;      пример: getdta
getdta  macro
        mov     ah,2fh
        int     21h
    pop es
        endm
;;   выбоp дисковода
;;   вход: номеp дисковода (0-а,1-b и т.д.)
;;      выход: число логических дисководов
;;   пpимеp: seld disk,kol
seld    macro     disk,kol
    push    dx  
        mov  dl,disk
     mov  ah,0eh
     int  21h
     mov  ds:kol,al
    pop dx
     endm
;;      выдача размера свободного пространства на диске
;;      вход: номер дисковода (0-по умолчанию,1-а и т.д.;байт)
;;             поле для числа секторов на кластер
;;             поле для доступного числа кластеров
;;             поле для числа байтов на сектор
;;             поле для числа кластеров на диске
;;                   (слова)
;;      выход: (ax)=0fffh,если номер дисковода указан неверно
;;      пример: disksp 1,chsk,dck,chbs,chkd
disksp  macro   dr,chsk,dck,chbs,chkd
    local   pr
    push_regs <bx,cx,dx>
        mov     dl,dr
        mov     ah,36h
        int     21h
    cmp ax,0fffh
    be  pr
    mov chsk,ax
pr: mov dck,bx
    mov chbs,cx
    mov chkd,cx
    pop_regs <dx,cx,bx>
        endm
;;      создание каталога
;;      вход:путь и имя как единое поле,заканчивающееся символом 0
;;      выход: если нет ошибки,то (сf)=0
;;             если есть ошибка,то (cf)=1 и в ax выдается код ошибки:
;;              (ax)=3  путь не найден
;;                  =5  нет места в родительском каталоге или путь указывает
;;                      на устройство или существует файл с таким же именем
;;                      в текущем каталоге
;;      пример: makedir pth
makedir  macro   path
    push    dx
        mov     dx,offset path
        mov     ah,39h
        int     21h
    pop dx
        endm
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2015, 00:44
Помогаю со студенческими работами здесь

Массив. Найти количество положительных и сумму нечетных отрицательных элементов
1.Содержащего 10 целых чисел , найти количество положительных элементов массива и сумму нечетных...

Дан вектор В(10). У всех отрицательных элементов, стоящих на нечетных местах, заменить знак на противоположный
Дан вектор В(10). У всех отрицательных элементов, стоящих на нечетных местах, заменить знак на...

Дан массив A3: E8 найти сумму положительных элементов и количество отрицательных
1) в ячейках E2:E16 находится значение, найти max значение, записать в ячейку E1. 2) Дан массив ...

Из суммы положительных элементов вектора вычесть сумму отрицательных, найти наибольший элемент вектора
Не знаю с чего начать решение задачи, плохо понимаю в программировании. Помогите пожалуйста решить...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru