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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2013, 16:09   #11
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Алексей_2012, скачайте книгу С.В.Зубкова "Ассемблер для DOS,Windows и Unix". Найдёте в ней ответы на все свои вопросы..
vadimych вне форума Ответить с цитированием
Старый 04.02.2013, 16:11   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
push 0b900h; что вносим в стек?
этим значением иницилизируется значение сегмента данных (регистр ds - смотри pop ds)
но, лично для меня это тоже загадка, что за "волшебное число" возникло?!

vadimych, поясните, пожалуйста!


Цитата:
mov byte ptr [di],' '; что делает эта строчка?
по указателю в di (он указывает на формируемую строчку) мы заносим пробел

Цитата:
test ax,ax; и это не понятно)
это код выполняется, чтобы определить, что за значение находится в ax,
устанавливаются флаги.
следующей командой идёт
jnz @1 - переход на метку @1, если в ax было не нулевое значение


Цитата:
xor di,di; вот это обнуление?
точно так!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.02.2013, 17:35   #13
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Serge_Bliznykov, строка для вывода формируется на 2-й странице видеопамяти.

Последний раз редактировалось vadimych; 04.02.2013 в 17:39.
vadimych вне форума Ответить с цитированием
Старый 04.02.2013, 20:03   #14
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
строка для вывода формируется на 2-й странице видеопамяти.
ага. спасибо за ответ!

ну да, B800h - первая (обычно видимая страница видеопамяти), это я помнил, т.к. использовал для прямого вывода символов, а про вторую страничку забыл...

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

Цитата:
Код:
mov ah,9
xor dx,dx
int 21h
Зачем здесь обнуление? почему без него не работает?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 06.02.2013, 01:24   #16
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Цитата:
Код:
mov ah,2

@2:
pop ax
or al,30h
mov [di],al
inc di
loop @2
а это процедура вывода символа в строку ?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 06.02.2013, 01:50   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Зачем здесь обнуление? почему без него не работает?
Цитата:
DOS Int 21h, Fn 09H: Выдать строку на дисплей
Вход
AH = 09H
DS:DX = адрес строки, заканчивающейся символом '$' (ASCII 24H)
блаблаблабла
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.02.2013, 01:59   #18
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

алгоритм я понял такой (в кратце, но общая часть понятна): сравнивается ах с 0, если не равно, то число делится на 10 пока ач не будет равен 0, затем с помощью цикла выводится в строчку, например чтобы вывести 333, надо его разделить три раза на 10 и вывести его по частям?

я код под себя подстроил, проверьте комментарии пожалуйста

Код:
.model small  ; указываем тип памяти
.stack 20h    ; инициализируем размер стека
.code         ; инициализация кода
begin:        ; начало программы
push 0b900h
pop ds

mov si,','    ; помещаем разделитель цифр
xor ax,ax     ; обнуление регистра хранения чисел
xor di,di     ; обнуление регистра для вывода строки
mov bx,10     ; в бх делитель=10 
mov cx,1000/3 ; цикл для нахождения чисел, которые делятся на 3
m4:           ; метка
add ax,3      ; прибавляем к ах 3
push cx       ; записываем позицию цикла в стек
push ax       ; записываем в стек текущее число
xor cx,cx     ; обнуляем счетный цикл
m1:
xor dx,dx     ; обнуляем регистр где бедет остаток 
div bx        ; делим ах на 10
push dx       ; запись остатка в стек
inc cx        ; увеличиваем число цикла для вывода числа или фрагмента числа
cmp ax,0      ; если делимое не 0
jne m1        ; то повторяем операции
mov ah,2      ; функция вывода одного символа
m2:
pop ax        ; восстанавливаем число из стека
add al,30h    ; преобразуем в askii-код
mov [di],al   ; записываем в строковый массив
inc di        ; увеличиваем пизицию в массиве для записи разделителя
loop m2
mov [di],si   ; запись в массив разделителя
inc di        ; переход на следущую позицию в строке для записи других символов 
pop ax        ; восстанавливаем сохраненное в ах
pop cx        ; восстанавливаем цикл
loop m4
mov si,'$'    ; признак конца строки
mov [di],si   ; заканчиваем вывод символов
mov ah,9      ; вывод строки символов, которые делятся на 3
xor dx,dx     ; обнуление регистра для корректного вывода
int 21h       ; прерывание



mov ah,1      ; для выхода-нажать любую клавишу
int 21h       ; прерывание
mov ax,4c00h  ; функция выхода из программы
int 21h       
end begin
vadimych, Serge_Bliznykov, Пепел Феникса: ОГРОМНОЕ СПАСИБО ВАМ ЗА ПОМОЩЬ!!
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 06.02.2013, 05:27   #19
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Алексей_2012, комментарии нормальные. Только строка
Код:
mov ah,2      ; функция вывода одного символа
ни к чему вообще в коде.
Удачи.
vadimych вне форума Ответить с цитированием
Старый 07.02.2013, 01:05   #20
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

эх, опять код не понравился, сказали что студент, знающий ассемблер может написать программу в 16 команд используя массивы, видимо этого от меня и добиваются, может ли кто-то помочь? а я пока попытаюсь изменить вот этот код:

Код:
.model small
.stack 20h
.data
buffer dw 1000 dup (?)

.code
start:

mov ax,@data
mov ds,ax

mov di,offset buffer
mov si,di
add si,4
mov cx,1000

mov ax,1

@3:
mov [di],ax
add di,2
inc ax
loop @3

mov bx,10
mov cx,1000/3

@4:
mov ax,[si]
add si,6
push cx

xor cx,cx

@1:
xor dx,dx
div bx
push dx
inc cx
test ax,ax
jnz @1

mov ah,2

@2:
pop dx
or dl,30h
int 21h
loop @2

mov dl,20h
int 21h
pop cx
loop @4

xor ax,ax
int 16h

mov ax,4c00h
int 21h
end start
vadimych, спасибо Вам еще раз за код!
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