Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите поправить программу по assembler чтобы работала пожалуйста

Tzeench 2.0 Ученик (236), закрыт 10 лет назад
Ввести массив с клавиатуры, найти в нем максимальный элемент и вывести его на экран

s_s segment stack "stack"
dw 12 dup(?)
s_s ends

d_s segment
x db 12 dup(?),0ah,0dh,"$"
y db 12 dup(?),0ah,0dh,"$"
d_s ends

c_s segment
assume ss:s_s,ds:d_s,cs:c_s
begin:
mov ax,d_s
mov ds,ax
mov si,0
L1:mov ah,01h
int 21h
cmp al,13d
je L3
mov x[si],al
sub x[si],30h
add bl,x[si]
add x[si],30h
inc si
jmp L1
L3:

mov ah,9h
lea dx,x
int 21h
mov ah,9h
lea dx,y
int 21h
mov dl,bl
L7:cmp dl,9h
jng L4
cmp dl,15
jng L6
mov bl,dl
and bl,00001111b
shr dl,4
add dl,30h
mov ah,02h
int 21h
mov dl,bl
jmp L7
mov dl,bl
mov ah,02
jmp L5
L6:add dl,37h
jmp L5
L4:add dl,30h
L5:mov ah,02
int 21h

mov ah,4ch
int 21h
int 20h
c_s ends
end begin


работает только если вводишь 1 число, если вводишь несколько, то выдает либо различные рисунки
Лучший ответ
Миоко Таканава Гений (51598) 11 лет назад
Программа не работает, потому что в ней нет даже намёка на массив. Вы взяли чью-то программу, которая подсчитывала сумму цифр введённого числа и выводила полученную сумму в шестнадцатеричной системе (ну или что-то в этом роде) , и просто её изуродовали. Что делала эта программа со вторым числом (y) понять по такому "обрубку" уже невозможно.

s_s segment stack "stack"
    dw 256 dup(?)
s_s ends

d_s segment
PromptN db "Введите кол-во элементов массива: $"
PromptA db "Введите элементы массива: ", 13, 10, 36
Result db "Максимальный элемент: $"

N dw ?
Array dw 256 dup (?)
d_s ends

c_s segment
    assume ss:s_s,ds:d_s,cs:c_s
begin:
    mov ax,d_s
    mov ds,ax
    mov es, ax
    lea dx, PromptN
    mov ah, 9
    int 21h
    push 256
    push 1
    call Input
    mov N, ax

    mov cx, ax
    lea dx, PromptA
    mov ah, 9
    int 21h
    lea di, Array
ReadLoop:
    mov ax, N
    inc ax
    sub ax, cx
    call Print
    mov al, ':'
    int 29h
    mov al, 32
    int 29h
    push 32767
    push -32767
    call Input
    stosw
    loop ReadLoop

    lea di, Array
    mov ax, [di]
    lea si, [di+2]
    mov cx, N
    dec cx
    jcxz CmpEnd
CmpLoop:
    cmp ax, [si]
    jge CmpNext
    mov di, si
CmpNext:
    add si, 2
    loop CmpLoop
CmpEnd:
    xchg si, di
    lea dx, Result
    mov ah, 9
    int 21h
    lodsw
    call Print

    mov ah, 7
    int 21h
    mov ah,4ch
    int 21h

Input proc stdcall uses bx cx dx di si es, LowBound :word, UpBound :word
    xor bx, bx
    mov di, bx
    mov si, bx
    mov cx, bx
InpRep:
    mov ah, 7
    int 21h
    test al, al
    jnz InpCR
    int 21h
    jmp InpRep
InpCR:
    mov bl, al
    jcxz InpSign
    cmp al, 13
    jne InpBS
    cmp cx, 1
    jne InpTest
    test bh, 1
    jnz InpRep
InpTest:
    mov ax, di
    xor ax, si
    sub ax, si
    cmp ax, LowBound
    jl InpRep
    cmp ax, UpBound
    jg InpRep
    jmp InpQuit
InpBS:
    cmp al, 8
    jne InpDig
    cmp cx, 1
    jne InpBS2
    test bh, 1
    jz InpBS2
    xor bx, bx
    mov si, bx
InpBS2:
    mov al, 8
    int 29h
    mov al, 32
    int 29h
    mov al, 8
    int 29h
    mov ax, di
    mov di, 10
    xor dx, dx
    div di
    mov di, ax
    dec cx
    jmp InpRep
InpSign:
    cmp al, '-'
    jne InpPlus
    not si
    jmp InpSign3
InpPlus:
    cmp al, '+'
    jne InpDig
InpSign3:
    or bh, 1
InpNext:
    inc cx
    mov al, bl
    int 29h
    jmp InpRep
InpDig:
    sub al, 30h
    jb InpRep
    cmp al, 9
    ja InpRep
    xor ah, ah
    mov es, di
    xchg di, ax
    mov dx, 10
    mul dx
    jc InpRestor
    add di, ax
    jno InpNext
InpRestor:
    mov di, es
    jmp InpRep
InpQuit:
    push ax
    mov al, 13
    int 29h
    mov al, 10
    int 29h
    pop ax
    ret
Input endp

Print proc stdcall uses ax dx bx
    cwd
    test dx, dx
    jz PrRec
    xor ax, dx
    sub ax, dx
    push ax
    mov al, '-'
    int 29h
    pop ax
    xor dx, dx
PrRec:
    mov bx, 10
    div bx
    or dl, 30h
    test ax, ax
    jz PrOut
    call Print
PrOut:
    mov al, dl
    int 29h
    ret
Print endp

c_s ends
    end begin

Остальные ответы
Άηϑρέΰ ҂ Искусственный Интеллект (180095) 11 лет назад
сейчас 98 поставлю и начню все проверять. . имхо асм забывать - кощунство
... Гений (84997) 11 лет назад
Я вообще не понимаю логики программы.
Даже сначала.. . Возьмем отрывок:
mov ax,d_s ;инициализируем ds (всё ок)
mov ds,ax
mov si,0 ;si - указатель в памяти на массив. ок.
L1:mov ah,01h ;читаем символ с клавы (прерыв. DOS)
int 21h ;
cmp al,13d ;Если ввод - на выход (а пробовали backspace н-р? )
je L3 ;
mov x[si],al ;заносим введённый символ в массив
sub x[si],30h ;преобразовываем в число отнимая код 0
add bl,x[si] ;зачем-то суммируем в bl ЗАЧЕМ?
;Вы не переведете введенную строку в число так. н-р я введу 1 и 2 (12)
;а в bl = 3
add x[si],30h ;обратно преобразовываем в символ. хм. ну ок.
inc si ;следующий символ в массиве
jmp L1 ;цикл пока не нажмём ввод

Тут-же нет контроля кол-ва введённых символов - возможно переполнение. Дальше Вы пытаетесь на экран вывести строку.
Где цикл ввода чисел хотя-бы? Как вы собираетесь ввести несколько чисел? через пробел? где это учитывается и идёт разбивка.
Сделайте сначала нормальный ввод. Посмотрите функцию чтения с клавиатуры через DOS фунцию 0ah int 21h.

Если что - пишите на почту - попробую помочь
Ариэль Знаток (306) 11 лет назад
да.. . эту программу все-таки лучше переписать с нуля. . чем пытаться в ней найти правду, поддерживаю ...само начало уже пугает, а там еще какие то битовые операции! зачем?
у вас можно уже на стадии ввода анализировать.. . а не пихать в конец
Похожие вопросы