WMmail.ru - сервис почтовых рассылок

суббота, 25 декабря 2010 г.

RFpro.ru: Ассемблер? Это просто! Учимся программировать

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

Реклама Отказаться от рекламы
"Рейтинг Рунета" открыт для народного голосования... "Рейтинг Рунета" открыт для народного голосования...
Конкурс сайтов "Рейтинг Рунета" - ежегодная премия за лучшие интернет-проекты в своей номинации, проводимая среди профессиональных веб-разработчиков...
 
Subscribe.Ru

RFpro.ru: Ассемблер? Это просто! Учимся программировать

    Мои подписки     Мои группы     Мои новости     Друзья     Избранное

Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2623
• повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2281
• повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1318
• повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1407
Дата выхода:26.12.2010, 10:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:225 / 68
Вопросов / ответов:4 / 4

Вопрос № 181471: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Разработать программу которая: Вводит число 567911, затем умножает его на 2. Потом полученное число складывает с 10228. И делит полученную сумму на 10. Выводит рез...


Вопрос № 181480: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:Помочь с решением задачи на ассемблере ( среда, ассемблер 16 битный под DOS , tasm и tlink , использовать модель памя...
Вопрос № 181483: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Осуществить ввод с клавиатуры целых положительных чисел и отсортировать их так, чтобы минимальное число было посередине,а остальные в порядке возрастания разместить справа ...
Вопрос № 181487: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Дан массив из целых чисел. Найти в массиве и вывести на экран периоды возрастания, а также найти и вывести максимальный элемент и его номер. Модель Small, ассемблер T...

Вопрос № 181471:

Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
Разработать программу которая:
Вводит число 567911, затем умножает его на 2. Потом полученное число складывает с 10228. И делит полученную сумму на 10. Выводит результат.
Для решения использовать Tasm без использования директивы model, операционная система ДОС, формат ЕХЕ. Приложите к решению пожалуйста блок-схему. И можно комментарии по возможности к каждой строке. Заранее спасибо!

Отправлен: 20.12.2010, 09:05
Вопрос задал: Руслан Чернов (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Руслан Чернов!
Задание предусматривает умножение/деление, когда результат не помещается в слово
Надо использовать двойные слова. Это раз. Второе: задание так построено, что обычные mul/div не работают! Будет переполнение!
Т.о. возникла необходимость в написании собственных подпрограмм умножения/деления двойного слова на слово.
При этом предполагаем, что результат умножения/сложения не выходит за пределы двойного слова.
PS Число 567911 вводим с клавиатуры...
Код:
;Вводит число 567911, затем умножает его на 2.
;Потом получен ное число складывает с 10228.
;И делит полученную сумму на 10.
;Выводит результат.

.186 ;чтобы можно было использовать push <число>
assume cs:code, ds:data, es:data
code segment para public 'code'
start:
mov ax, data
mov ds, ax
mov es, ax ;пусть es=ds=data

lea dx, sNum
mov ah, 9
int 21h ;ждем число N

mov bNum, 80 ;задаем максимальное значение строки
lea dx, bNum
mov ah, 0ah
int 21h ;вводим числовую строку

lea dx, sResult
mov ah, 9
int 21h ;выведем сообщение о результате

lea si, bBuf ;строка
call stol ;преобразовываем в число dx:ax

push 2
push ax
push dx
call Mul_DW_W ;умножим на dx:ax на 2

add ax, 10228
adc dx, 0 ;dx:ax = dx:ax + 10228

push 10
push ax
push dx
call Div_DW_W ;разделим dx:ax на 10

push ax
push dx
call PrintNum ;выведем dx:ax

Exit:
lea dx, sPress ;выведем приглаш ение нажать на любую клавишу
mov ah, 9
int 21h

mov ah, 0 ;ждем
int 16h

mov ax, 4c00h
int 21h ;выход в ДОС

;умножаем столбиком двойное слово на слово
;параметры:
;1 - старшее слово множимого
mul_dw_hi equ word ptr [bp+4]
;2 - младшее слово множимого
mul_dw_lo equ word ptr [bp+6]
;3 - множитель
mul_w equ word ptr [bp+8]
;результат в dx:ax
Mul_DW_W proc
push bp
mov bp, sp ;параметры будем адресовать через стек
mov ax, mul_w ;ax = множитель
mul mul_dw_lo ;умножаем на младшее слово множителя
push ax ;сохраняем младшее слово результата
xchg dx, mul_dw_hi ;dx = ст слово множителя, mul_dw_hi = ст слово предыд умножения
mov ax, mul_w ;ax = множитель
mul dx ;умножаем на старшее слово множителя
add ax, mul_dw_hi ;добавим ст слово предыд умножения
mov dx, ax ;ст слово произведения
pop ax ;мл слово произведения
pop bp
ret 6 ;уберем из стека 3 параметра
Mul_DW_ W endp

;делим двойное слово на слово
;параметры:
;1 - ст слово делимого
div_dw_hi equ word ptr [bp+4]
;2 - мл слово делимого
div_dw_lo equ word ptr [bp+6]
;3 - делитель
div_w equ word ptr [bp+8]
;результат: dx:ax - частное, bx - остаток
Div_DW_W proc
push bp
mov bp, sp ;параметры будем адресовать через стек
;разделим старшее слово на делитель
mov ax, div_dw_hi ;ax = ст слово делимого
xor dx, dx ;dx = 0
div div_w ;
push ax ;сохраним ст разряд (ст слово) результата
;разделим мл слово на делитель
;при этом учитываем, что остаток от предыдущего деления есть ст слово для этого
mov ax, div_dw_lo ;мл слово делимого
div div_w ;ax = мл слово частного
mov bx, dx ;bx = остаток
pop dx ;dx = ст слово частного
pop bp
ret 6 ;уберем из стека 3 параметра
Div_DW_W endp

;выводим двойное слово
;сначала сохраняем в стеке разряды (делением на 10), затем выводим в обратном порядке
;д ля деления используем Div_DW_W
;параметры:
;1 - ст слово
num_hi equ [bp+4]
;1 - мл слово
num_lo equ [bp+6]
PrintNum pr oc
push bp
mov bp, sp ;параметры будем адресовать через стек
mov ax, num_lo
mov dx, num_hi ;число dx:ax
xor cx, cx ;счетчик разрядов
DivLoop: ;цикл преобразования в разряды
push 10
push ax
push dx
call Div_DW_W ;dx:ax = dx:ax / 10
push bx ;сохраним в стеке остаток
inc cx ;считаем
test dx, dx ;проверим оба слова на 0
jnz DivLoop
test ax, ax ;продолжаем, пока не дойдем до 0
jnz DivLoop
PrLoop: ;цикл вывода в обратном порядке
pop ax ;берем число 0-9 из стека
or al, '0' ;преобразовываем в символ '0'-'9'
int 29h ;выводим
loop PrLoop

pop bp
ret 4 ;уберем из стека 2 параметра
PrintNum endp

stol proc ;преобразование строки [si] в число DX:AX
xor ax, ax ;будем стоить 32-битное число в dx:ax
xor dx, dx
xor cx, cx ;счетчик разрядов
stol_next:
mov bl, [si] ;очередной символ
inc si
cmp bl, 0dh ;конец стоки?
je st ol_eol
cmp bl, '0'
jb stol_sep ;любая нецифра - разделитель
cmp bl, '9'
ja stol_sep

push 10
push ax
push dx
call Mul_DW_W ;dx:ax = dx:ax * 10
and bx, 0fh ;'0'-'9' -> 0-9
add ax, bx ;добавляем новый разряд
adc dx, 0 ;учитываем перенос
inc cx ;считаем
jmp stol_next ;продолжаем
stol_sep: ;встретили разделитель
jcxz stol_next ;были только разделители - на продолжение
; иначе - конец числа и выходим
stol_eol: ; если числа нет и встретили 0dh - конец строки
ret ;число возвращаем в dx:ax
stol endp
code ends

data segment para public 'data'
sNum db 'Enter N: $'
sResult db 0ah,'Result: $'
sPress db 0dh,0ah,'Press any key$'
;буфер для ввода числовой строки (для функции 0ah)
bNum db ? ;максимальный размер буфера
bCount db ? ;реальный размер строки
bBuf db 80 dup (?) ;сама строка
data ends

end start


181471-block-shema.doc (45.0 кб)
-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 20.12.2010, 12:12
Номер ответа: 264926
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Оценка ответа: 5

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264926 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 181480:

    Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:Помочь с решением задачи на ассемблере ( среда, ассемблер 16 битный под DOS , tasm и tlink , использовать модель памяти small) : Найти 7 наименьших элементов массива А(15).Записать их в массив В.
    Просьба написать пояснение к операторам в программе .
    Вот пример одной из програмы в данной среде.

    Код:
    .model small
    .stack 48
    .data
    string db 10 dup (?),'$'
    chet db 5 dup (?)
    nech db 5 dup (?)
    ic db 0
    it db 0
    .code
    mov ax,@data< br> mov ds,dx
    mov es,ax
    mov ss,ax
    lea di,string
    mov cl,10
    mov ah,1
    c1: int 21h
    and al,ofh
    sosb
    loop c1
    mov bl,2
    mov bh,3
    lea si,string
    lea di,chet
    lea bp,nech
    mov cl,10
    mov dh,0
    c2: xor ax,ax
    lodsb
    mov dl,al
    div bl
    cmp ah,0
    je cd
    xor ax,ax
    mov al,dl
    div bh
    cmp ah,0
    je nd
    jmp cc
    cd: xor ax,ax
    mov al,dh
    div bl
    cmp ah,0
    jne c06
    mov al,dl
    or al,30h
    stosb
    inc ic
    jmp cc
    c06: cmp dl,0
    je n06
    cmp dl,6
    je n06
    cmp cc
    nd: xor ax,ax
    mov al,dh
    div bl
    cmp ah,0
    je cc
    n06: or dl,30h
    mov [bp],dl
    inc bp
    inc it
    cc: inc dh
    loop c2
    mov cl,ic
    lea si,chet
    lea di,string
    rep movsb
    mov cl,it
    lea si,nech
    rep movsb
    mov al,'$'
    mov ah,'^'
    sc: scasb
    jz vyvod
    dec di
    mov [di],ah
    inc di
    jmp sc
    vyvod: mov dl,10
    mov ah,2
    int 21h
    lea dx,string
    mov ah,9
    int 21h
    mov ah,4ch
    int 21h
    end

    Отправлен: 20.12.2010, 16:45
    Вопрос задал: кирюша (Посетитель)
    Всего ответов: 1
    Страница вопроса »


    Отвечает Лысков Игорь Витальевич (Старший модератор) :
    Здравствуйте, кирюша!
    Вот Вам программа. Если что неясно - милости просим в мини-форум
    Код:
    ;Найти 7 наименьших элементов массива А(15).Записать их в массив В
    .model small
    .data
    A db 15 dup (?) ;массив из 15 байт-символов
    lenA equ $-A ;длина его (=15)
    B db 7 dup (?) ;массив для первых 7 минимальных
    lenB equ $-B ;длина (=7)
    db '$' ;для вывода с помощью 9 функции
    sEnter db 'Enter 15 symbols: $'
    sFirst db 0dh,0ah,'First 7 min: $'
    sAny db 0dh,0ah,'Press any key$'

    .code
    start:
    mov ax, @data
    mov ds, ax
    mov es, ax
    mov ss, ax

    lea dx, sEnter ;приглашение на ввод 15 символ ов
    mov ah, 9
    int 21h

    lea di, A ;адрес массива
    mov cx, lenA ;число элементов
    mov ah, 1
    c1: int 21h ;ждем символ
    stosb ;сохраняем
    loop c1 ;ровно 15 штук

    ;сортируем методом пузырька
    lea si, A ;адрес начала массива
    mov cx, lenA ;cx - число сортируемых элементов
    dec cx ;число сравнений
    SortLoop: ;цикл по поиску очередного минимального
    lea di, [si+1] ;начинаем со следующего
    push cx ;сохраним счетчик
    mov al, [si] ;текущий минимальный по адресу [si]
    SearchMinLoop: ;цикл по всем последующим
    ;сравниваем текущий со всеми последующими
    cmp al, [di] ;если текущий минимальный <= последующего,
    jbe SortNext ; то обходим обмен
    ;меняем местами элементы
    xchg al, [di]
    mov [si], al ;по адресу [si] и в al новый минимальный
    SortNext:
    inc di ;на следующий последующий
    loop SearchMinLoop
    inc si ;на следующий текущий
    pop cx ;восстановим счетчик сравнений
    loop SortL oop

    ;копируем 7 первых в массив В
    lea si, A ;откуда
    lea di, B ;куда
    mov cx, lenB ;7 штук
    rep movsb

    lea dx, sFirst
    mov ah, 9
    int 21h ;Сообщение о 7 миним

    lea dx, B
    mov ah, 9
    int 21h ;сами 7 минимальные

    lea dx, sAny
    mov ah, 9
    int 21h ;any key

    mov ah, 8
    int 21h ;ждем any key

    mov ah, 4ch
    int 21h

    end start

    -----
    Люби своего ближнего, как самого себя

    Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
    Ответ отправлен: 21.12.2010, 12:19
    Номер ответа: 264966
    Украина, Кировоград
    Тел.: +380957525051
    ICQ # 234137952
    Mail.ru-агент: igorlyskov@mail.ru

    Оценка ответа: 5

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264966 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 181483:

    Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
    Осуществить ввод с клавиатуры целых положительных чисел и отсортировать их так, чтобы минимальное число было посередине,а остальные в порядке возрастания разместить справа и слева (поочереди) от минимального и вывести на экран.
    например, введены числа: 153789; получить: 851379
    модель памяти SMALL, ассемблер TASM.
    желательны пояснения.
    Спасибо за помощь (:

    Отправлен: 20.12.2010, 20:13
    Вопрос задал: Романенко Татьяна Викторовна (Посетитель)
    Всего ответов: 1
    Страница вопроса »


    Отвечает Лысков Игорь Витальевич (Старший модератор) :
    Здравствуйте, Романенко Татьяна Викторовна!
    Обижаете Мы пояснения пишем всегда.
    Что непонятно, спрашивайте в мини-форуме.
    Хочу только остановиться на нескольких моментах:
    1) считаем, что числовая строка не превышает 64 байта (проверка не производится)
    2) для сортировки применен метод пузырька (надеюсь, знаком ).
    3) чтобы обеспечить попеременного размещения справа/слева, использован вызов подпрограммы, адрес которой лежит в регистре
    4) для смены адреса подпрограммы использован прием двоекратного применения операции xor.
    Сначала со смещением одной подпрограммы, затем другой. Этим достигается смена одного адреса на другой.
    Код:

    .model small
    .code
    .startup

    lea dx, sEnter
    mov ah, 9
    int 21h ;приглашаем ввести число

    lea bx, sNum ;адрес числовой строки
    EnterLoop:
    mov ah, 1
    int 21h ;ждем код
    cmp al, 0dh
    je Sort ;по Enter-у идкм дальше
    cmp al, '0'
    jb EnterLoop ;нецифры игнорируем
    cmp al, '9'
    ja EnterLoop
    mov [bx] ,al ;сохраняем
    inc bx ;на следующую позицию
    jmp EnterLoop

    Sort: ;сортируем методом пузырька
    lea si, sNum ;адрес начала массива
    mov cx, bx ;адрес конца
    sub cx, si ;cx - число сортируемых элементов
    cmp cx, 2 ;0 и 1 нет смысла сортировать
    jb Exit
    dec cx ;число сравнений
    SortLoop: ;цикл по поиску очередного минимального
    lea di, [si+1] ;начинаем со следующего
    push cx ;сохраним счетчик
    mov al , [si] ;текущий минимальный по адресу [si]
    SearchMinLoop: ;цикл по всем последующим
    ;сравниваем текущий со всеми последующими
    cmp al, [di] ;если текущий минимальный <= последующего,
    jbe SortNext ; то обходим обмен
    ;меняем местами элементы
    xchg al, [di]
    mov [si], al ;по адресу [si] и в al новый минимальный
    SortNext:
    inc di ;на следующий последующий
    loop SearchMinLoop
    inc si ;на следующий текущий
    pop cx ;восстановим счетчик сравнений
    loop SortLoop

    ;строим новое число
    lea si, sNum ;адрес начала массива
    mov cx, bx ;адрес конца
    sub cx, si ;cx - число элементов

    lea di, sSort ;адрес начала сортированного массива
    mov ax, cx ;длина
    shr ax, 1 ;половина
    adc di, ax ;начало записи в сортированном массиве
    ;причем для нечетного необходимо добавить 1
    ;мы этого добиваемся сложив с битом переноса
    mov bx, di ;bx - адрес слева, di - справа
    lea bp, rout_2 ;подпрограмма отраб отки записи
    push cx ;сохраним длину массива
    FormLoop:
    lodsb ;читаем очередной
    call bp ;вызов или rout_1, или rout_2
    xor bp, offset rout_1 ;смена адреса rout_1 на rout_2, и наоборот!
    xor bp, offset rout_2 ;интересный "финт" :)
    loop FormLoop ;по всем
    pop bx ;длина массива
    mov byte ptr sSort[bx], '$' ;вставим в конце '$' для 9 функции

    lea dx, sResult
    mov ah, 9
    int 21h ;выведем результат

    lea dx, sSort
    mov ah, 9
    int 21h ;отсортированную строку

    Exit:
    lea dx, sAny
    mov ah, 9
    int 21h ;any key

    mov ah, 1
    int 21h ;ждем any key

    mov ax, 4c00h
    int 21h ;выход в ДОС

    rout_1 proc ;подпрограмма записи справа
    mov [di], al
    inc di
    ret
    rout_1 endp

    rout_2 proc ;подпрограмма записи слева
    dec bx
    mov [bx], al
    ret
    rout_2 endp

    .data
    sEnter db 'Enter number: $'
    sResult db 0dh,0ah,'Result n umber: $'
    sAny db 0dh,0ah,'Press any key$'
    sNum db 64 dup (?)
    sSort db 64 dup (?)

    end

    -----
    Люби своего ближнего, как самого себя

    Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
    Ответ отправлен: 21.12.2010, 02:29
    Номер ответа: 264957
    Украина, Кировоград
    Тел.: +380957525051
    ICQ # 234137952
    Mail.ru-агент: igorlyskov@mail.ru

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264957 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 181487:

    Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
    Дан массив из целых чисел. Найти в массиве и вывести на экран периоды возрастания,
    а также найти и вывести максимальный элемент и его номер.
    Модель Small, ассемблер Tasm.
    Спасибо за помощь!

    Отправлен: 20.12.2010, 20:18
    Вопрос задал: Романенко Татьяна Викторовна (Посетитель)
    Всего ответов: 1
    Страница вопроса »


    Отвечает Лысков Игорь Витальевич (Старший модератор) :
    Здравствуйте, Романенко Татьяна Викторовна!
    Программа анализирует массив байт, заданный в сегменте данных.
    Смотрите коментарий в тексте программы. Если что непонятно, мини-форум к Вашим услугам

    Код:
    ;Дан массив из целых чисел. Найти в массиве и вывести на экран периоды возрастания, 
    ;а также найти и вывести максимальный элемент и его номер.
    .model small
    .code
    .startup

    lea dx, sIncrease ;выведем сообщение о выводе периодов возрастания
    mov ah, 9
    int 21h

    xor si, si ;индекс в массиве чисел
    mov cx, len_num ;количество чисел
    mov dx, 8000h ;dh - максимальный элемен т, 80h = -128 (самое маленькое число)
    ;dl - индекс макс элемента
    mov bx, 0080h ;bh - текущее число возрастания
    ;bl - предыдущий элемент, 80h = -128 (самое маленькое число)
    mov ah, 0 ;ah - число периодов возрастания
    MainLoop: ;цикл по всем элементам
    mov al, num[si] ;очередной
    ;сравниваем с максимальным
    cmp al, dh
    jle Increase
    mov dx, si ;запомним индекс (в dl)
    mov dh, al ;и новое максимальное значение

    Increase: ;проверим на периоды возрастания
    cmp al, bl ;сравниваем с предыдущим
    jle endInc ;<= - возраст последовательность закончилась либо ее не было
    ;идет возраст последовательность
    cmp bl, 80h ;для первого элемента
    je SetStart ;просто сохраняем начало последовательности и новый предыдущий элемент
    inc bh ;для всех последующих - считаем
    jmp new_code ;на сохранение нового предыдущего элемента
    endInc: ;возраст последовательность закончилась либо ее не было
    cmp bh, 0 ;есл и последовательности не было
    je SetStart ;сохраняем начало последовательности и новый предыдущий элемент
    inc ah ;была - считаем
    call PrInc ;выводим текущую последовательность, начиная с [di] и длиной bh
    SetStart:
    mov di, si ;адрес начала последовательности
    new_code:
    mov bl, al ;сохраним новый предыдущий элемент
    inc si ;на следующий элемент
    loop MainLoop ;по всем элементам массива

    ;проверим последнюю последовательность
    cmp bh, 0 ;было ли что-то возрастающее?
    je cmpInc ;не было, на проверку, было ли вообще
    inc ah ;считаем
    call PrInc ;и выводим
    jmp PrMax ;на вывод максимального элемента
    cmpInc:
    cmp ah, 0 ;проверим, а были ли вообще возраст последовательности
    jne PrMax ;были - на вывод макс
    lea dx, sNotFound ;сообщение, что не были
    mov ah, 9
    int 21h
    PrMax: ;вывод на экран
    push dx ;сохраним
    lea dx, sMax
    mov ah, 9
    int 21h
    pop dx
    push dx
    mov al, d l ;индекс с 0
    call PrByte
    lea dx, sEqual
    mov ah, 9
    int 21h
    pop dx
    mov al, dh ;максимальный элемент
    call PrByte
    ;выход
    lea dx, sAny
    mov ah, 9
    int 21h ;any key

    mov ah, 8
    int 21h ;ждем any key

    mov ax, 4c00h
    int 21h ;выход в ДОС

    PrInc proc ;вывод последовательности, начиная с [di] и длиной bh
    push ax dx
    inc bh ;добавим самый первый, который не считался
    IncreasePrint:
    mov al, num[di] ;элемент
    inc di ;на след
    call PrByte ;выводим, в конце пробел
    dec bh ;счетчик - 1
    jnz IncreasePrint
    mov dl, 0dh ;перевод строки
    int 21h
    mov dl, 0ah
    int 21h
    pop dx ax
    ret
    PrInc endp

    PrByte proc ;вывод байта, как числовой строки (со знаком)
    push bx cx
    mov bl, 10 ;будем делить на 10
    xor cx, cx ;счетчик цифр
    test al, al ;проверим на минус
    jns divLoop ;положительное
    push ax
    mov dl, '-'
    mov ah, 2
    int 21h ;выведем минус
    pop ax
    neg al ;модуль
    divLoop:
    mov ah, 0 ;подготавливаемся к делению
    div bl ;ax / 10
    push ax ;с охраним ah - остаток - очередную цмладшую цифру
    inc cx ;ситаем
    cmp al, 0 ;еще есть десятичные разряды?
    jne divLoop
    prLoop: ;выведем в обратном порядке
    pop ax ;извлечем цифру в ah
    mov dl, ah ;для функции 2
    or dl, '0' ;0-9 -> '0'-'9'
    mov ah, 2
    int 21h ;выведем
    loop prLoop ;по всем цифрам
    mov dl, ' '
    int 21h
    pop cx bx
    ret
    PrByte endp

    .data
    sIncrease db 'Increase periods:',0dh,0ah,'$'
    sNotFound db 'Not found',0dh,0ah,'$'
    sMax db 'Max = num[ $'
    sEqual db '] = $'
    sAny db 0dh,0ah,'Press any key$'
    ;примерный массив
    num db -3,-4,-5,-5,3,0,1,2,1,-1,3,5,7,6,5,6,7,8,4,-3
    ;его длина
    len_num equ $-num

    end

    -----
    Люби своего ближнего, как самого себя

    Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
    Ответ отправлен: 21.12.2010, 10:59
    Номер ответа: 264961
    Украина, Кировоград
    Тел.: +380957525051
    ICQ # 234137952
    Mail.ru-агент: igorlyskov@mail.ru

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264961 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.25 от 13.12.2010
    Обсудить выпуск
     
     Как вам этот выпуск ?  Дайте свой отзыв  или  Оцените   5    4    3    2    1,   можно письмом:  5    4    3    2    1
     
      Рассылки
    Волшебство программирования на 1С:Предприятие 7.7 и 8.0
    Обучение программированию в среде 1С:Предприятие 7.7 и 8.0. Очень просто и понятно. Небольшие комплексные примеры показывают, что на 1С можно быстро и легко создавать работающие системы как по мановению волшебной палочки!

    Подписаться:   на сайте    по почте

     
      Группы
    «Глупые, но не дающие покоя вопросы»
    Вы ни когда не задумывались над какой-нибудь мелочью, которая никак не может выйти у Вас из головы или когда совсем не о чем подумать появляются мысли "а...
    «Передовые технологии в медицине»
    Передовые технологии в медицине!Все больше и больше людей интересуются - есть ли новые медицинские технологии, которые позволяют бороться с хроническими...
    «Рукоделие»
    Всё самое полезное о рукоделии! Уроки, описания, советы, схемы, книги! Вязание, шитьё, вышивание, обработка кожи, лепка, макраме, валяние, ткачество, ко...
     
    Подписан адрес: admin10383.deep@blogger.com
    Код этой рассылки: comp.prog.assembler
    Архив рассылки
    Отписаться:  На сайте  Почтой
    Поддержка подписчиков
    Убрать рекламу
    Другие рассылки этой тематики
    Другие рассылки этого автора
    Рассылка производится: Subscribe.Ru / ЗАО «Интернет-Проекты» / О компании / Политика конфиденциальности

    Комментариев нет:

    Отправить комментарий