Другие языки программирования и технологии

Задачка на ассемблере (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

Леонид Рудик
Леонид Рудик
51 590
Лучший ответ
ввод с клавиатуры целочисленного массива из N элементов - полнейший бред...
1. напиши пример на бумаге и прорешай его вручную (пошагово) согласно предложенного алгоритма...
2. начни с описания массивов, необходимых для задачи...
3....
Роман Крячко 1) в задании сказано именно с клавиатуры.
2) на паскале я бы решил эту задачу, но нужно на ассемблере, а на нем программировать не получается (
напиши на паскале и дизассемблируй )
Said Ayubov
Said Ayubov
20 058
Роман Крячко попробовал... написал код и продизасемблировал его...
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
А в чём проблема? для начала надо написать функцию корректно считывающая данные с клавы, после забить это дело в цикл, который помещает результат в память. А последнее еще проще, тупо цикл от 2 до предпоследнего элемента с необходимыми вычислениями через add и sub
Дима Хегай
Дима Хегай
241
Роман Крячко ну напиши пожалуйста, я плохо знаю команды -_-