Другие языки программирования и технологии
Задачка на ассемблере (DOS BOX)
Написать программу на языке Ассемблера, которая позволяет ввести с клавиатуры целочисленный массив из N элементов, сформировать и вывести на экран новый массив, в котором первый и последний элементы соответствуют элементам исходного массива, а остальные вычисляются путем прибавления к соответствующему элементу исходного массива следующего за ним элемента в исходном массиве и вычитания из полученной суммы предыдущего элемента исходного массива.
.model small
.286
.stack 100h
.data
PromptN db "Введите размер массива (3 ...100): $"
PromptX db "Введите элементы массива (-100 ...100):", 13, 10, 36
ErrorMsg db "Ошибка! Повторите ввод. ", 13, 10, 36
ResultMsg db 10, "Преобразованный массив: ", 13, 10, 36
WaitMsg db 10, 10, "Для продолжения нажмите любую клавишу... $"
N dw ?
Array dw 100 dup (?)
Buff db 5, ?,5 dup (?)
.code
N186168996:
mov bp, @data
mov es, bp
mov ds, bp
RepInpN:
mov ah, 9
lea dx, PromptN
int 21h
call ReadInt
jnc Main1
MainErr1:
call WriteError
jmp RepInpN
Main1:
mov N, ax
sub ax, 3
cmp ax, 97
ja MainErr1
mov ah, 9
lea dx, PromptX
int 21h
mov cx, N
lea di, Array
RepInpX:
mov ax, N
sub ax, cx
inc ax
call WriteInt
mov al, ':'
int 29h
mov al, 32
int 29h
call ReadInt
stosw
jnc Main2
MainErr2:
call WriteError
sub di, 2
jmp RepInpX
Main2:
add ax, 100
cmp ax, 200
ja MainErr2
loop RepInpX
mov cx, N
dec cx
lea si, Array
mov di, si
lodsw
mov dx, ax
DoLoop:
lodsw
add ax, [si]
sub ax, [di]
xchg dx, ax
stosw
loop DoLoop
mov ah, 9
lea dx, ResultMsg
int 21h
mov cx, N
lea si, Array
PrintLoop:
lodsw
call WriteInt
loop PrintLoop
mov ah, 9
lea dx, WaitMsg
int 21h
dec ah
int 21h
mov ah, 4Ch
int 21h
WriteError proc
mov ah, 9
lea dx, ErrorMsg
int 21h
ret
WriteError endp
WriteInt proc
pusha
cwd
xor ax, dx
sub ax, dx
and dl, '-'
or dl, 32
mov di, dx
mov bx, 10
mov cx, 1
WrInt1:
xor dx, dx
div bx
or dl, '0'
push dx
inc cx
test ax, ax
jnz WrInt1
push di
mov ax, 5
sub ax, cx
mov cx, ax
WrInt2:
push 32
loop WrInt2
mov cx, 5
WrInt3:
pop ax
int 29h
loop WrInt3
popa
ret
WriteInt endp
ReadInt proc
push cx
push di
mov ah, 10
lea dx, Buff
int 21h
xor di, di
mov bx, 10
mov si, 2
mov al, Buff[si - 1]
test al, al
jz RdInt3
mov al, Buff[si]
cmp al, '-'
je RdInt2
cmp al, '+'
je RdInt2
RdInt1:
mov al, Buff[si]
cmp al, 13
je RdInt4
sub al, '0'
cmp al, 9
ja RdInt3
cbw
xchg ax, di
mul bx
add di, ax
RdInt2:
inc si
jmp RdInt1
RdInt3:
stc
jmp RdInt6
RdInt4:
cmp Buff + 2, '-'
jne RdInt5
neg di
RdInt5:
clc
RdInt6:
pushf
mov al, bl
int 29h
popf
mov ax, di
pop di
pop cx
ret
ReadInt endp
end N186168996

.286
.stack 100h
.data
PromptN db "Введите размер массива (3 ...100): $"
PromptX db "Введите элементы массива (-100 ...100):", 13, 10, 36
ErrorMsg db "Ошибка! Повторите ввод. ", 13, 10, 36
ResultMsg db 10, "Преобразованный массив: ", 13, 10, 36
WaitMsg db 10, 10, "Для продолжения нажмите любую клавишу... $"
N dw ?
Array dw 100 dup (?)
Buff db 5, ?,5 dup (?)
.code
N186168996:
mov bp, @data
mov es, bp
mov ds, bp
RepInpN:
mov ah, 9
lea dx, PromptN
int 21h
call ReadInt
jnc Main1
MainErr1:
call WriteError
jmp RepInpN
Main1:
mov N, ax
sub ax, 3
cmp ax, 97
ja MainErr1
mov ah, 9
lea dx, PromptX
int 21h
mov cx, N
lea di, Array
RepInpX:
mov ax, N
sub ax, cx
inc ax
call WriteInt
mov al, ':'
int 29h
mov al, 32
int 29h
call ReadInt
stosw
jnc Main2
MainErr2:
call WriteError
sub di, 2
jmp RepInpX
Main2:
add ax, 100
cmp ax, 200
ja MainErr2
loop RepInpX
mov cx, N
dec cx
lea si, Array
mov di, si
lodsw
mov dx, ax
DoLoop:
lodsw
add ax, [si]
sub ax, [di]
xchg dx, ax
stosw
loop DoLoop
mov ah, 9
lea dx, ResultMsg
int 21h
mov cx, N
lea si, Array
PrintLoop:
lodsw
call WriteInt
loop PrintLoop
mov ah, 9
lea dx, WaitMsg
int 21h
dec ah
int 21h
mov ah, 4Ch
int 21h
WriteError proc
mov ah, 9
lea dx, ErrorMsg
int 21h
ret
WriteError endp
WriteInt proc
pusha
cwd
xor ax, dx
sub ax, dx
and dl, '-'
or dl, 32
mov di, dx
mov bx, 10
mov cx, 1
WrInt1:
xor dx, dx
div bx
or dl, '0'
push dx
inc cx
test ax, ax
jnz WrInt1
push di
mov ax, 5
sub ax, cx
mov cx, ax
WrInt2:
push 32
loop WrInt2
mov cx, 5
WrInt3:
pop ax
int 29h
loop WrInt3
popa
ret
WriteInt endp
ReadInt proc
push cx
push di
mov ah, 10
lea dx, Buff
int 21h
xor di, di
mov bx, 10
mov si, 2
mov al, Buff[si - 1]
test al, al
jz RdInt3
mov al, Buff[si]
cmp al, '-'
je RdInt2
cmp al, '+'
je RdInt2
RdInt1:
mov al, Buff[si]
cmp al, 13
je RdInt4
sub al, '0'
cmp al, 9
ja RdInt3
cbw
xchg ax, di
mul bx
add di, ax
RdInt2:
inc si
jmp RdInt1
RdInt3:
stc
jmp RdInt6
RdInt4:
cmp Buff + 2, '-'
jne RdInt5
neg di
RdInt5:
clc
RdInt6:
pushf
mov al, bl
int 29h
popf
mov ax, di
pop di
pop cx
ret
ReadInt endp
end N186168996

ввод с клавиатуры целочисленного массива из N элементов - полнейший бред...
1. напиши пример на бумаге и прорешай его вручную (пошагово) согласно предложенного алгоритма...
2. начни с описания массивов, необходимых для задачи...
3....
1. напиши пример на бумаге и прорешай его вручную (пошагово) согласно предложенного алгоритма...
2. начни с описания массивов, необходимых для задачи...
3....
напиши на паскале и дизассемблируй )
Роман Крячко
попробовал... написал код и продизасемблировал его...
program Project2;
var
a:array [1..100] of integer;
F1,F2:Text;
N,i:integer;
begin
Assign (F1,'input.txt');
Reset (F1);
Assign (F2,'output.txt');
Rewrite (F2);
read (F1,N);
for i:=1 to N do
read (F1,a[i]);
for i:=2 to (N-1) do
a[i]:=a[i]+a[i+1]-a[i-1];
for i:=1 to N do
write (F2,a[i],' ');
close (F1);
Close (F2);
end.
program Project2;
var
a:array [1..100] of integer;
F1,F2:Text;
N,i:integer;
begin
Assign (F1,'input.txt');
Reset (F1);
Assign (F2,'output.txt');
Rewrite (F2);
read (F1,N);
for i:=1 to N do
read (F1,a[i]);
for i:=2 to (N-1) do
a[i]:=a[i]+a[i+1]-a[i-1];
for i:=1 to N do
write (F2,a[i],' ');
close (F1);
Close (F2);
end.
Ilias Ukanov
там ппц, килобайт минимум 25-30, представляете сколько это в ассемблере будет, джунгли
.model small
.286
.stack 100h
.data
PromptN db "Введите размер массива (3 ...100): $"
PromptX db "Введите элементы массива (-100 ...100):", 13, 10, 36
ErrorMsg db "Ошибка! Повторите ввод. ", 13, 10, 36
ResultMsg db 10, "Преобразованный массив: ", 13, 10, 36
WaitMsg db 10, 10, "Для продолжения нажмите любую клавишу... $"
N dw ?
Array dw 100 dup (?)
Buff db 5, ?,5 dup (?)
.code
N186168996:
mov bp, @data
mov es, bp
mov ds, bp
RepInpN:
mov ah, 9
lea dx, PromptN
int 21h
call ReadInt
jnc Main1
MainErr1:
call WriteError
jmp RepInpN
Main1:
mov N, ax
sub ax, 3
cmp ax, 97
ja MainErr1
mov ah, 9
lea dx, PromptX
int 21h
mov cx, N
lea di, Array
RepInpX:
mov ax, N
sub ax, cx
inc ax
call WriteInt
mov al, ':'
int 29h
mov al, 32
int 29h
call ReadInt
stosw
jnc Main2
MainErr2:
call WriteError
sub di, 2
jmp RepInpX
Main2:
add ax, 100
cmp ax, 200
ja MainErr2
loop RepInpX
mov cx, N
dec cx
lea si, Array
mov di, si
lodsw
mov dx, ax
DoLoop:
lodsw
add ax, [si]
sub ax, [di]
xchg dx, ax
stosw
loop DoLoop
mov ah, 9
lea dx, ResultMsg
int 21h
mov cx, N
lea si, Array
PrintLoop:
lodsw
call WriteInt
loop PrintLoop
mov ah, 9
lea dx, WaitMsg
int 21h
dec ah
int 21h
mov ah, 4Ch
int 21h
WriteError proc
mov ah, 9
lea dx, ErrorMsg
int 21h
ret
WriteError endp
WriteInt proc
pusha
cwd
xor ax, dx
sub ax, dx
and dl, '-'
or dl, 32
mov di, dx
mov bx, 10
mov cx, 1
WrInt1:
xor dx, dx
div bx
or dl, '0'
push dx
inc cx
test ax, ax
jnz WrInt1
push di
mov ax, 5
sub ax, cx
mov cx, ax
WrInt2:
push 32
loop WrInt2
mov cx, 5
WrInt3:
pop ax
int 29h
loop WrInt3
popa
ret
WriteInt endp
ReadInt proc
push cx
push di
mov ah, 10
lea dx, Buff
int 21h
xor di, di
mov bx, 10
mov si, 2
mov al, Buff[si - 1]
test al, al
jz RdInt3
mov al, Buff[si]
cmp al, '-'
je RdInt2
cmp al, '+'
je RdInt2
RdInt1:
mov al, Buff[si]
cmp al, 13
je RdInt4
sub al, '0'
cmp al, 9
ja RdInt3
cbw
xchg ax, di
mul bx
add di, ax
RdInt2:
inc si
jmp RdInt1
RdInt3:
stc
jmp RdInt6
RdInt4:
cmp Buff + 2, '-'
jne RdInt5
neg di
RdInt5:
clc
RdInt6:
pushf
mov al, bl
int 29h
popf
mov ax, di
pop di
pop cx
ret
ReadInt endp
end N186168996
.286
.stack 100h
.data
PromptN db "Введите размер массива (3 ...100): $"
PromptX db "Введите элементы массива (-100 ...100):", 13, 10, 36
ErrorMsg db "Ошибка! Повторите ввод. ", 13, 10, 36
ResultMsg db 10, "Преобразованный массив: ", 13, 10, 36
WaitMsg db 10, 10, "Для продолжения нажмите любую клавишу... $"
N dw ?
Array dw 100 dup (?)
Buff db 5, ?,5 dup (?)
.code
N186168996:
mov bp, @data
mov es, bp
mov ds, bp
RepInpN:
mov ah, 9
lea dx, PromptN
int 21h
call ReadInt
jnc Main1
MainErr1:
call WriteError
jmp RepInpN
Main1:
mov N, ax
sub ax, 3
cmp ax, 97
ja MainErr1
mov ah, 9
lea dx, PromptX
int 21h
mov cx, N
lea di, Array
RepInpX:
mov ax, N
sub ax, cx
inc ax
call WriteInt
mov al, ':'
int 29h
mov al, 32
int 29h
call ReadInt
stosw
jnc Main2
MainErr2:
call WriteError
sub di, 2
jmp RepInpX
Main2:
add ax, 100
cmp ax, 200
ja MainErr2
loop RepInpX
mov cx, N
dec cx
lea si, Array
mov di, si
lodsw
mov dx, ax
DoLoop:
lodsw
add ax, [si]
sub ax, [di]
xchg dx, ax
stosw
loop DoLoop
mov ah, 9
lea dx, ResultMsg
int 21h
mov cx, N
lea si, Array
PrintLoop:
lodsw
call WriteInt
loop PrintLoop
mov ah, 9
lea dx, WaitMsg
int 21h
dec ah
int 21h
mov ah, 4Ch
int 21h
WriteError proc
mov ah, 9
lea dx, ErrorMsg
int 21h
ret
WriteError endp
WriteInt proc
pusha
cwd
xor ax, dx
sub ax, dx
and dl, '-'
or dl, 32
mov di, dx
mov bx, 10
mov cx, 1
WrInt1:
xor dx, dx
div bx
or dl, '0'
push dx
inc cx
test ax, ax
jnz WrInt1
push di
mov ax, 5
sub ax, cx
mov cx, ax
WrInt2:
push 32
loop WrInt2
mov cx, 5
WrInt3:
pop ax
int 29h
loop WrInt3
popa
ret
WriteInt endp
ReadInt proc
push cx
push di
mov ah, 10
lea dx, Buff
int 21h
xor di, di
mov bx, 10
mov si, 2
mov al, Buff[si - 1]
test al, al
jz RdInt3
mov al, Buff[si]
cmp al, '-'
je RdInt2
cmp al, '+'
je RdInt2
RdInt1:
mov al, Buff[si]
cmp al, 13
je RdInt4
sub al, '0'
cmp al, 9
ja RdInt3
cbw
xchg ax, di
mul bx
add di, ax
RdInt2:
inc si
jmp RdInt1
RdInt3:
stc
jmp RdInt6
RdInt4:
cmp Buff + 2, '-'
jne RdInt5
neg di
RdInt5:
clc
RdInt6:
pushf
mov al, bl
int 29h
popf
mov ax, di
pop di
pop cx
ret
ReadInt endp
end N186168996
А в чём проблема? для начала надо написать функцию корректно считывающая данные с клавы, после забить это дело в цикл, который помещает результат в память. А последнее еще проще, тупо цикл от 2 до предпоследнего элемента с необходимыми вычислениями через add и sub
Роман Крячко
ну напиши пожалуйста, я плохо знаю команды -_-
Похожие вопросы
- Простейшая задачка на Ассемблере
- Как работать с DOS-Box? Желательно поподробнее?
- Вопрос по изучению языка Ассемблера под MS DOS. (Нужны советы по программному обеспечению/программированию)
- Что может ассемблер?
- Почему многие программисты ненавидят ассемблер?Ведь у него куча плюсов!Он позволяет максимально задействовать
- Помогите решить задачку (ассемблер-тасм)
- На комп проникли. связано с DoS или DOS. что дальше? как жить?
- С помощью команд fpu вычислить площадь круга, исходя из введѐнного диаметра. Ассемблер...
- Ассемблер сегодня и завтра.
- стоит ли изучать ассемблер, если программирую на Делфи? и вообще реально ли что нибудь хорошее, дельное, нужное написать
2) на паскале я бы решил эту задачу, но нужно на ассемблере, а на нем программировать не получается (