Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Assembler] Массив чисел 
V
    Опции темы
deuterium
Дата 15.11.2008, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 11.2.2008

Репутация: нет
Всего: нет



Помогите пожалуйста написать вот такую прогу:
1. В ней задается массив из 10 чисел (цифр, двухзначных и трехзначных, положительных и отрицательных), например: 4, -23, 3, 276, -79, -345, 6, 44, -77, 111.
2. Прога считает сумму чисел, находящихся в интервале от -100 до 100, а также произведение всех положительных чисел.
3. Всё это выводится на экран.
  smile 

Вот у меня есть код для вывода числа на экран:
Код

      ;Vivod 4isla "-5"
      mov ax, -5
      xor dx, dx
      mov si, 10
      mov di, 5

      push ax
      cmp ax, 0
      jg M
      neg ax

    M:div si
      add dl, 30h
      mov a[di], dl
      xor dx, dx
      dec di

      cmp ax, 0
      jne M
      pop ax

      cmp ax, 0
      jg Vivod
      mov a[di], '-'

Vivod:mov  ah, 9
      lea dx, a
      int 21h

      mov ah, 0
      int 16h

PM   Вверх
IKM2007
Дата 17.11.2008, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 4
Всего: 40



deuterium, я тоже только учу Assembler, пока что отрицательные числа не проходили, да и при больших числах результат умножения неправильно получается(если результат больше 3*10^5).
Вот код, возможно поможет. Вводишь сперва количество чисел, потом вводишь элементы массива.
Код

name1    segment 'stack'
    dw 64 dup(?)
name1    ends

name2    segment 'data'

message1    db 'Vvedite razmer massiva.$'
message2    db 'vvedite chislo.$'
size    dw ?
answer1    dw 0
answer2    dw 1
input    db 6,7 dup('$'),'$'
output    db 6 dup('0'),'$'
endl    db 10,13,'$'
name2    ends

name3    segment 'code'
assume    ss:name1,ds:name2,cs:name3

name4    proc far

push    ds
xor    ax,ax
push    ax
mov    ax,name2
mov    ds,ax

;program
;vvodim chislo
mov    ah,9
lea    dx,message1
int    21h

mov    ah,9
lea    dx,endl
int    21h

mov    ah,10
lea    dx,input
int    21h

mov    ah,9
lea    dx,endl
int    21h

call    in
mov    size,ax

;size-um kanak@ pahac e

mov    cx,size
l1:
mov    ah,9
lea    dx,message2
int    21h

mov    ah,9
lea    dx,endl
int    21h

mov    ah,10
lea    dx,input
int    21h

call    in

cmp    ax,100
jg    end
add    answer1,ax

cmp    ax,0
jl    end
mul    answer2

mov    answer2,ax

end:
mov    ah,9
lea    dx,endl
int    21h

loop    l1

mov    ax,answer1
call    out

mov    ah,9
lea    dx,output
int    21h

mov    ah,9
lea    dx,endl
int    21h


mov    ax,answer2
call    out

mov    ah,9
lea    dx,output
int    21h

mov    ah,9
lea    dx,endl
int    21h

ret

name4    endp

out    proc

push    dx
push    bx
push    ax
push    si

mov    bx,10
mov    si,5

l2:
cmp    ax,0
jz    end1
xor    dx,dx
div    bx
add    dl,'0'
mov    output[si],dl
dec    si
jmp    l2

end1:
pop    si
pop    ax
pop    bx
pop    dx

ret
out    endp

in    proc

push    bx
push    cx
push    dx
push    si

mov    ax,0
mov    bx,10
mov    si,2

l3:
mov    cl,input[si]
cmp    cl,13
jz    end2
sub    cl,'0'
mul    bx
xor    ch,ch
add    ax,cx
inc    si
jmp    l3

end2:
pop    si
pop    dx
pop    cx
pop    bx

ret
in    endp

name3    ends
        end    name4



--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
deuterium
Дата 17.11.2008, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 11.2.2008

Репутация: нет
Всего: нет



IKM2007, 
Спасибо за помощь, но мне нужна прога без ввода данных с клавиатуры, а только с выводом, т.е. гораздо проще.   smile 
Исходные данные, т.е. элементы массива, должны быть уже изначально вбиты в код проги.
PM   Вверх
IKM2007
Дата 18.11.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 4
Всего: 40



Код

name1    segment stack 'stack'
     dw 64 dup(?)
name1   ends

name2   segment 'data'
mass    dw 2,30,5,105,'$';твой массив
answer1    dw 0
answer2 dw 1
output  db 6 dup('0'),'$'
endl    db 10,13,'$'
name2   ends

name3   segment 'code'
assume  ss:name1,ds:name2,cs:name3

name4   proc far

push    ds
xor     ax,ax
push    ax
mov     ax,name2
mov     ds,ax

;program
xor    si,si

l:
cmp    mass[si],'$'
jz    end4

cmp     mass[si],100
jg     end3

mov    ax,answer1
add    ax,mass[si]
mov    answer1,ax

end3:
mov     ax,answer2

mul    mass[si]
mov    answer2,ax

inc    si
inc    si
jmp l
end4:

mov     ax,answer1
call    out_m

mov     ah,9
lea     dx,output
int     21h

mov     ah,9
lea     dx,endl
int     21h

mov     ax,answer2
call    out_m

mov     ah,9
lea     dx,output
int     21h

mov     ah,9
lea     dx,endl
int     21h

ret

name4   endp

out_m   proc uses dx,bx,ax,si

mov     bx,10
mov     si,5

l2:
cmp     ax,0
jz     end1
xor     dx,dx
div     bx
add     dl,'0'
mov     output[si],dl
dec     si
jmp     l2

end1:

ret
out_m   endp

name3   ends
        end    name4



--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
deuterium
Дата 19.11.2008, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 11.2.2008

Репутация: нет
Всего: нет



IKM2007, 
Спасибо, конечно. Но как-то странно твоя прога работает. Да и с отрицательными числами не справляется.  smile   smile 
PM   Вверх
IKM2007
Дата 19.11.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 4
Всего: 40



deuterium, я в массив вместо 
Цитата(deuterium @  15.11.2008,  18:22 Найти цитируемый пост)
4, -23, 3, 276, -79, -345, 6, 44, -77, 111.

написал свои числа(положительные, так как уже обьяснил, что с отрицательными числами пока не знаком), и эти числа должны быть такие, чтобы их произведение не превышало 30000. Сказал, что прога не правильная, но лучше чем ничего.


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
deuterium
Дата 21.11.2008, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 11.2.2008

Репутация: нет
Всего: нет



IKM2007, 
Согласен, что это лучше, чем ничего. Но эта прога мне немного не подходит. В любом случае спасибо за помощь. 

Желательно, чтобы прога была похожа на проги, рассмотренные тут: http://forum.vingrad.ru/forum/topic-235310.html
Тем более, что ввод не нужен.

Может кто-то еще поможет?!  smile  smile 
PM   Вверх
Evjeny
Дата 24.11.2008, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 14.8.2006

Репутация: 3
Всего: 5



Код

masm
model small

.stack

.data

mas dw 4, -23, 3, 276, -79, -345, 6, 44, -77, 111

.code

main:

    mov ax, @data
    mov ds, ax
    
    xor ax, ax
    xor si, si
    mov cx, 10
    
cycle_sum:
    cmp mas[si], -100
    jl next
    cmp mas[si], 100
    jg next
    add ax, mas[si]
next:
    add si, 2
    loop cycle_sum
    
    mov ax, 4c00h
    int 21h
end main


Здесь выполнено только часть задания. Программа считает сумму в интервале [-100;100]. Результат в ax. Произведение и вывод постараюсь дописать сегодня, если будет время.
PM MAIL WWW   Вверх
deuterium
Дата 24.11.2008, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 11.2.2008

Репутация: нет
Всего: нет



Evjeny, 
Огромное спасибо!!!  smile  smile  smile 
Это как раз то, что мне нужно.  smile 

Код для вывода у меня уже есть готовый (приведен в шапке). Нужно только его состыковать с этой прогой.
Ну конечно же не помешало бы и произведение.

Но большое спасибо и на этом.

А возможно ли как-то сейчас просмотреть результат (пока не реализован вывод)?  smile 

PM   Вверх
IKM2007
Дата 25.11.2008, 05:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 4
Всего: 40



Цитата(deuterium @  24.11.2008,  20:33 Найти цитируемый пост)
А возможно ли как-то сейчас просмотреть результат (пока не реализован вывод)?

Отладчиком посмотри.


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
Evjeny
Дата 26.11.2008, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 14.8.2006

Репутация: 3
Всего: 5



Код

masm
model small

.stack

.data
mult dw 18 dup (?), '$'
mult1 dw 18 dup (?), '$'
mas dw 4, -23, 3, 276, -79, -345, 6, 44, -77, 111
sum db 5 dup (0)

.code

myproc proc
    cmp cx, 1
    je exit
    dec cx
    push cx
    mov cx, 18
    lea si, mult
    lea di, mult1
    rep movsw
    pop cx
loop2:
    push cx
    clc
    mov cx, 18
    mov si, 0
    
loop1:
    mov ax, mult[si]
    adc mult1[si], ax
    pushf
    add si, 2
    popf
    loop loop1
    pop cx
    loop loop2
    mov cx, 18
    lea si, mult1
    lea di, mult
    rep movsw
exit:
    ret
myproc endp

main:

    mov ax, @data
    mov ds, ax
    mov es, ax
    
    xor ax, ax
    xor si, si
    mov cx, 10
    
cycle_sum:
    cmp mas[si], -100
    jl next
    cmp mas[si], 100
    jg next
    add ax, mas[si]
next:
    add si, 2
    loop cycle_sum
    
    xor dx, dx
    mov si, 10
    mov di, 5

    push ax
    cmp ax, 0
    jg M
    neg ax

M:  
    div si
    add dl, 30h
    mov sum[di], dl
    xor dx, dx
    dec di

    cmp ax, 0
    jne M
    pop ax

    cmp ax, 0
    jg Vivod
    mov sum[di], '-'

Vivod:
    mov  ah, 9
    lea dx, sum
    int 21h

    mov ah, 0
    int 16h
    
    mov si, 0
    mov cx, 10
find_fp:
    cmp mas[si], 0
    jnge next1
    mov ax, mas[si]
    mov mult, ax
    add si, 2
    dec cx
    jmp next_cycle
next1:
    add si, 2
    loop find_fp

next_cycle:
    push cx
    cmp mas[si], 0
    jnge next2
    mov cx, mas[si]
    push si
    call myproc
    pop si
next2:
    add si, 2
    pop cx
    loop next_cycle

    mov ax, 4c00h
    int 21h
end main


Реализовано: сумма с выводом и произведение без вывода(на всякий, реализовал произведение, если все числа в массиве будут 999, вроде 36ти байт для такого числа должно хватить).
Вывод произведения попробуй реализовать сам, пойдет на пользу. Произведение формируется в массивах mult и mult1. Выбирай любой из них smile 
PM MAIL WWW   Вверх
deuterium
Дата 26.11.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 11.2.2008

Репутация: нет
Всего: нет



Evjeny, 
Большое спасибо, вывод результата работает, но как-то странно. Помимо самого числа (-122) выводится еще куча иероглифов и надпись: DOS SET BLOCK (4Ah) error, да к тому же системный динамик при этом запищал.
Что это такое?  smile 

Да, и как всё-таки просмотреть тот результат для произведения. Я понимаю, что с помощью отладчика (td.exe ***.exe), но что конкретно там надо сделать, чтобы увидеть окончательный результат?  smile 

Это сообщение отредактировал(а) deuterium - 26.11.2008, 12:46
PM   Вверх
Evjeny
Дата 27.11.2008, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 14.8.2006

Репутация: 3
Всего: 5



PM MAIL WWW   Вверх
deuterium
Дата 30.11.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 11.2.2008

Репутация: нет
Всего: нет



Evjeny, 
Да с этой ошибкой я уже разобрался.
Вот преподаватель мне уже всё исправил.
Чисто для суммы получилось вот так:
Код

.model small
.stack
.data
        mas dw 4, -23, 3, 276, -79, -345, 6, 44, -77, 111
       ; mas db 4, 3, 3, 2, 7
        sum db 6 dup (' '), '$'

.code

    mov ax, @data
    mov ds, ax

    xor ax, ax
    xor di, di
    mov cx, 10

cycle_sum:
    cmp mas[di], -100
    jl next
    cmp mas[di], 100
    jg next
    add ax, mas[di]

next:
    add di, 2
    loop cycle_sum

    ; Vivod
    xor dx, dx

    mov si, 10
    mov di, 5
    push ax

    cmp ax, 0
    jg M
    neg ax

M:
    div si
    add dl, 30h
    mov sum[di], dl
    xor dx, dx
    dec di

    cmp ax, 0
    jne M
    pop ax

    cmp ax, 0
    jg Vivod
    mov sum[di], '-'

Vivod:
    mov ah, 9
    lea dx, sum
    int 21h

    mov ah, 0
    int 16h

    mov ah, 4ch
    int 21h

end


Осталось доделать произведение.
Дело в том, что в твоей проге много того, чего я вообще еще не учил.  smile 
Например, что такое: rep movsw, clc, adc, pushf, popf?
Можно как-то обойтись без этого?  smile 
PM   Вверх
deuterium
Дата 4.12.2008, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 11.2.2008

Репутация: нет
Всего: нет



Ну а вот и окончательный результат, как надо было сделать. Оказалось попроще, чем здесь предлагалось. Но в любом случае всем спасибо за помощь.

Код

.model small
.stack
.data
       ; mas dw 4, -23, 1, 30, -79, -248, 160
        mas db -4, -2, 1, 110, 2, -4, 10
        viv db 6 dup (' '), 10, 13, '$'

.code

    mov ax, @data
    mov ds, ax

    ; O4istka ekrana
    mov ah, 6
    mov al, 0
    mov bh, 7
    mov cx, 0
    mov dx, 184Fh
    int 10h

    ; Razmeshenie kursora
    mov ah, 2
    mov bh, 0
    mov dh, 0
    mov dl, 0
    int 10h

    ; Summa
    xor ax, ax
    xor di, di
    mov cx, 7 ; cx = 4islo el-tov massiva

cycle_sum:
    cmp mas[di], -100
    jl next
    cmp mas[di], 100
    jg next
    add al, mas[di] ; esli massiv db, to zdesi al, esli dw - to ax

next:
    add di, 1  ; db - 1, dw - 2
    loop cycle_sum

    ; Vivod summi
    xor dx, dx

    mov si, 10
    mov di, 5
    push ax

    cmp ax, 0
    jg M
    neg ax

M:
    div si
    add dl, 30h
    mov viv[di], dl
    xor dx, dx
    dec di

    cmp ax, 0
    jne M
    pop ax

    cmp ax, 0
    jg Vivod
    mov viv[di], '-'

Vivod:
    mov ah, 9
    lea dx, viv
    int 21h

    ; Proizvedenie
    xor ax, ax
    xor di, di
    mov cx, 7

cycle_pr:
    cmp mas[di], 0
    jl next1
    cmp ax, 0
    jne M1
    mov al, mas[di]
    jmp next1

M1:
    mul mas[di]

next1:
    add di, 1
    loop cycle_pr

    ; Vivod proizvedenia
    xor dx, dx

    mov si, 10
    mov di, 5
    push ax

    cmp ax, 0
    jg M2
    neg ax

M2:
    div si
    add dl, 30h
    mov viv[di], dl
    xor dx, dx
    dec di

    cmp ax, 0
    jne M2
    pop ax

    cmp ax, 0
    jg Vivod2
    mov viv[di], '-'

Vivod2:
    mov ah, 9
    lea dx, viv
    int 21h

    mov ah, 0
    int 16h

    mov ah, 4ch
    int 21h

end



 smile  smile  smile 


PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.