Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2013, 01:37   #31
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Код:
.model small                     ; модель памяти small
.stack 8                         ; стек 8 бит
.data
massiv_chisel dw 1000 dup (?)    ; объявление массива
np1 db 'BbIXOD-PROBEL $'         ; объявление строкового массива
.code                            ; сегмент кода
start:                           ; начало программы

jmp m11                          ; прыжок на метку м11
m10:                             ; m1,m2,...,m11-метки
mov ah,2
mov dl,0dh
int 21h                          ; переход на новую строку
m11:      
mov ax,@data
mov ds,ax
lea di,massiv_chisel             ; загрузка массива в регистр di
mov si,di                        ; загрузка содержимого di в si для последующей адресации к элементам di
add si,4                


mov cx,1000                      ; инициализация массива с 1 до 1000
mov ax,1                         ; указываем начало 1, в конце инициализации в ах будет 1000
m3:
mov [di],ax                      ; в первый адресант di помещаем 1
add di,2                         ; увеличиваем номер позиции массива на 2
inc ax                           ; увеличиваем ах на 1
loop m3                          ; повтор цикла пока сх не 0


mov bx,10                        ; в регистр bx помещаем делитель 10 (для вывода чисел)
mov cx,1000/3                    ; выставляем в цикл 333 (т.к надо числа которые делятся на 3 без остатка)
m4:
mov ax,[si]                      ; загрузка в ax первого адресанта si
add si,6                         ; увеличиваем позицию в si до 7-го,13-го.... элементов
push cx                          ; записываем текущий "оборот" счетчика в стек

xor cx,cx                        ; обнуляем счетчик

m1:
xor dx,dx                        ; обнуляем регистр dx, туда запишется остаток
div bx                           ; делим ах на 10
push dx                          ; запоминаем остаток
inc cx                           ; увеличиваем число циклов пока в ах не 0
cmp ax,0                         ; если ах не 0
jne m1                           ; то делим заново, т.к число будем выводить посимвольно

mov ah,2                         ; функция вывода одного символа

m2:
pop dx                           ; берем остаток из стека
add dl,30h                       ; переводим в символьный вид
int 21h                          ; прерывание, и вывод символа
loop m2                          ; повтор пока сх не 0
mov dx,','                       ; заносим в регистр для вывода разделитель
int 21h                          ; прерыванием выводим разделитель
pop cx                           ; восстанавливаем "оборот "счетчика
loop m4                          ; повтор пока сх не 0

mov ah,2
mov dl,0ah
int 21h                          ; переход на новую строчку

mov ah,09h      
lea dx,np1
int 21h                          ; вывод сообщения

mov ah,1                         ; ввод с клавиатуры символа для проверки на нажатие
int 21h

cmp al,' '                       ; если ввели не пробел
jne m10                          ; то повтор вывода чисел

mov ax,4c00h                     ; функция выхода из программы
int 21h
end start
kventin_zhuk, большое вам СПАСИБО!

вот мой код с комментариями, но хотелось бы сделать так, чтобы не было .data

если можете, то оптимизируйте пожалуйста)
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 08.02.2013, 01:48   #32
kventin_zhuk
БНТУ ФИТР
Форумчанин
 
Аватар для kventin_zhuk
 
Регистрация: 20.05.2012
Сообщений: 315
По умолчанию

Алексей_2012,
Дайте аргументированный ответ почему вы хотите отказаться от сегмента данных - завтра поковыряюсь. Этого делать не стоит. Погуглите хотя бы. А собственно я за вас погулю:
Цитата:
Чередование программы и данных может привести к нежелательным последствиям. Вследствие каких либо причин случайно данные могут быть выполнены в качестве программы или наоборот программа может быть воспринята и обработана как данные.
Помогло?

И ещё:
Цитата:
.stack 8 ; стек 8 бит
почему бит а не байт?
С++(console/builder/WinAPI/Linux), C#, Pascal, Delphi, Asm, Prolog.
< ----- Контакты
kventin_zhuk@live.com

Последний раз редактировалось kventin_zhuk; 08.02.2013 в 01:50.
kventin_zhuk вне форума Ответить с цитированием
Старый 08.02.2013, 02:02   #33
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

спасибо, уже исправил биты на байты, а зачем не использовать .data-потому что нас в колледже этому не учили, ну да ладно, буду переучиваться, тем более что ассемблер только пол года проходили, я думал он мне не пригодится, а оказалось что еще как пригодилось) а кто-нибудь сможет код оптимизировать, который последним выкладывал, конечно хорошо что с массивом разобрался, спасибо вашему форуму и отдельно всем тем, кто мне помогал, на примерах разбираться быстроее, но код большущий слишком
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 08.02.2013, 02:20   #34
kventin_zhuk
БНТУ ФИТР
Форумчанин
 
Аватар для kventin_zhuk
 
Регистрация: 20.05.2012
Сообщений: 315
По умолчанию

Алексей_2012, Я конечно не профессионал, может где-то ошибусь в терминах, но смотрите. Что такое команды ассемблера? Это мнемонические (символьные представления команд). Созданы исключительно для удобства человека, а их расшифровкой является байт-код, а уже расшифровкой байт-кода сами знаете что..... Так вот: возьмём безобидную команду mov ax,bx ; В памяти машины она будет предсталены как 89D8 - а это уже два байта реальной памяти. А теперь представьте. У вас есть программа, в памяти располагается последовательно 89D889D889D8 - всё шикарно. Но тут Вам захотелось вставить свой массив 12345678910. - вставили, замечательно. Но откуда машина будет знать что это не код??? Не будет она это знать. Поэтому она будет воспринимать ваши данные как команды и молотить что ни поподя. Так зачем вам эти проблемы?
Ваши преподы будут довольны, я уверен


По поводу оптимизации - времени особо нет, но что бросилось в глаза:

Вот это нужно делать один раз, а у вас там метки идут. Т.е при прыжках - снова будут выполняться две команды, а сколько раз вы будете прыгать, допустим 5 - это уже 5 * 2 лишних команд. Вынесите это после метки старт, но перед всеми остальными метками.
Код:
mov ax,@data
mov ds,ax
С++(console/builder/WinAPI/Linux), C#, Pascal, Delphi, Asm, Prolog.
< ----- Контакты
kventin_zhuk@live.com
kventin_zhuk вне форума Ответить с цитированием
Старый 08.02.2013, 02:59   #35
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

спасибо большое за объяснение, а на счет оптимизации если не трудно будет, то оптимизируйте код когда сможете, пожалуйста, я завтра этот код, к которому комментарий написал работодателю у которого прохожу практику от колледжа покажу, сто пудов не понравится и в третий раз меня пошлют переделовать хх)
from dark to light)

Последний раз редактировалось Алексей_2012; 08.02.2013 в 03:29.
Алексей_2012 вне форума Ответить с цитированием
Старый 08.02.2013, 08:36   #36
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Дайте аргументированный ответ почему вы хотите отказаться от сегмента данных - завтра поковыряюсь. Этого делать не стоит.
справедливости ради надо сказать, что есть такие программки как .COM
(они появились раньше, чем был придуман формат EXE, который поддерживает разделение на сегменты кода и данных)
Вот, например, (первый попавшийся под руку пример):
Код:
        model   tiny
        .code
        org     100h

start:    
;НАЧАЛО ПРОГРАММЫ
    ;mov ax,@data 
    ;mov ds,ax 

    mov dx,offset txt1 
    mov ah,9h 
    int 21h 

    mov ah, 0ah 
    mov dx,offset buftext
    int 21h 

    lea di, buftext+1 
    mov bh, 0
    mov bl, [di] 
    mov byte ptr [di+bx+1], '$'

    mov dx,offset txt2
    mov ah,9h 
    int 21h 

    mov dx,offset buftext+2
    mov ah,9h 
    int 21h 

    ; ожидание нажатия любой клавиши 
    mov ah, 0h  
    int 16h 
    ; выход в операционную систему
    mov ah, 4ch  
    int 21h 


maxl equ 50 

txt1 db 13,10,13,10,'Input your name: ','$'
txt2 db 13,10,13,10,'Привет, ','$'

buftext db maxl+1, ?, 80 dup(0) 


end start;КОНЕЦ ПРОГРАММЫ
Так вот, в таких программах сам программист занимается тем, что следит, где код и где данные, и нет никаких проблем с тем, чтобы записать в буфер команды, а потом выполнить их - что есть команды, что есть данные - решает программист.


Цитата:
Сообщение от Алексей_2012
работодателю у которого прохожу практику от колледжа покажу, сто пудов не понравится и в третий раз меня пошлют переделовать хх
Ну, возможно. Главное, чтобы это было обосновано и аргументированно. Если Вам сформулируют чётко и недвухсмысленно, чем Ваш код не подходит, то переделаете его. И уж, в любом случае, это пойдёт Вам на пользу - чем больше переделываете - тем больше узучаете язык и больше нового узнаёте, получаете новый опыт, знания (причём не абстрактные, а именно самые практические!). А ведь именно в этом и состоит цель вашего обучения!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.02.2013, 09:08   #37
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Цитата:
получаете новый опыт, знания (причём не абстрактные, а именно самые практические!). А ведь именно в этом и состоит цель вашего обучения!
Да спасибо, вы правы, но я сейчас на третьем курсе, а ассемблер проходили год назад, ито одно полугодие, работодатель у которого я на практике считает, что разобравшись в ассемблере, можно будет и слегкостью разобраться в других средакх программирования, но с С++ чуть сложнее будет, чем например с vbasic
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 08.02.2013, 13:29   #38
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Все, сходил, код показал, мне начальник сказал что нужно просмотреть и оптимизировать основной цикл, и слишком много прерываний, подумать может сделать как-то иначе, но похвалил за то что разобрался как работать с массивом, спасибо всем тем, кто помогал мне! Сейчас сижу думаю, но все равно в голову ничего не лезет
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 08.02.2013, 14:10   #39
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
нужно просмотреть и оптимизировать основной цикл, и слишком много прерываний, подумать может сделать как-то иначе
Отказаться от прерывания и делать вывод напрямую в видеопамять. Если бы можно было использовать команды работы со строками, то код был бы заметно короче.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 08.02.2013, 14:35   #40
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

можно использовать, но массив должен остаться
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
оптимизировать код destic Microsoft Office Excel 14 26.01.2013 01:12
Оптимизировать код strannick Microsoft Office Excel 9 14.11.2012 00:59
Оптимизировать код) Pein95 Паскаль, Turbo Pascal, PascalABC.NET 1 11.11.2011 18:42
Оптимизировать код. Манжосов Денис :) Общие вопросы Delphi 1 20.10.2008 19:06
Оптимизировать код NeiL Помощь студентам 2 21.02.2008 08:57