Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Assembler

Автор: DeadStrelok
Дата сообщения: 15.10.2010 22:56
Здравствуйте)
Задали такую задачку:
Заполнить символьный массив размерностью 3х3 и подсчитать количество всех согласных.
Ввод массива я собираюсь осуществить через с++, т.к. не знаю как сделать это на ассемблере.
Объясните, пожалуйста, как этот массив перевести во вставку ассемблера asm{ }, в которой, собственно, и будет проводиться подсчет, и как взять символ, например [0][0], для дальнейшей работы с ним.
Извеняюсь, если много требую, но помогите хоть с чем-нибуть.
Автор: bomzzz
Дата сообщения: 15.10.2010 23:00
но тогда тебе надо знать в какой форме и в каком месте С хранит в памяти данные массива.
на ассемблере, да так же практически - создай линейный массив а обрабатывай его двумя индексами
Автор: DeadStrelok
Дата сообщения: 15.10.2010 23:32
Дело в том, что в ассемблере нам только показали арифметические операторы, операторы ветвления и циклы, в которых я более менее разобрался. Но как осуществляется ввод или как работать с массивами, тем более символьными, я понятия не имею. Сейчас в поисках нормальной литературы.
Автор: bomzzz
Дата сообщения: 16.10.2010 03:14
в ассемблере нет массивов, если готового макроса нет конечно. просто строку делаешь. оперативная память линейная все равно.
у тебя ассемблер то какой 32 битный или 16 битный?
для ассемблерных вставок того что вам показали как бы достаточно если 32 битный
Автор: DeadStrelok
Дата сообщения: 16.10.2010 12:31
bomzzz

masm 5.10 16 битный
Автор: bomzzz
Дата сообщения: 16.10.2010 12:34
DeadStrelok
http://www.emu8086.com/
вот эту прогу скачай. ключ найдешь в инете, тут все простейшие примеры есть и ввод с клавиатуры и печать.
Автор: DeadStrelok
Дата сообщения: 16.10.2010 13:18
bomzzz
Cпасибо, попробую разобраться...
Автор: iMPRE7
Дата сообщения: 17.10.2010 12:59
Мне нужно восьмеричное введенное число сконвертировать в десятичное:

Я знаю что мне нужен:
1. регистр для хранения текущего множителя (8 в степени Х)
2. регистр для хранения 1-ой цифры умноженной на 8^X
3. регистр для хранения суммы (произведения цифры на 8^X)

И еще по-моему вывести рез. можно только через DX(DL), если не ошибаюсь?

Мне нужно сделать что-то наподобие этого(моя неудачная попытка):

в секцию .data записал строку:
schital db ?
чтобы знать длину числа

Процедура:

PROC Schiot
PUSH ax
PUSH cx
PUSH dx

MOV ax, 1
MOV cl, 0
PUSH "$$"

Cikl:
MUL dx, ax ;
MUL ax, 8
PUSH dx
CMP cl, schital:
JB Cikl

;Здесь не знаю как сделать именно 3 пункт из моего списка и как выводить это число

; ...........

Konec:

POP dx
POP cx
POP ax
RET
Schiot ENDP

Помогите пож это реализовать. Скажите хотя бы в чем ошибка, а уж если с тем в какие регистры что совать подскажете буду оч оч благодарен.
Завтра решается моя судьба, а я месяц над прогой тупел по 4ч в день и не выходит (
Автор: bomzzz
Дата сообщения: 17.10.2010 13:44
тоже скачай эммулятор, разбирай простейшие примеры когда поймешь как работает пойдет веселее.

Добавлено:
для перевода можно сопроцессор использовать.
Автор: DeadStrelok
Дата сообщения: 17.10.2010 17:57
[more=Вот что я написал]
.MODEL small
.STACK 256
.data
string db 'a','b','c','d','e','f','g','h','i'
sogl db 'bcdfghjklmnpqrstvwxz'
X dw ?
failed db 0ah,0dh, 'Нет согласных символов в массиве! ','$'
success db 0ah,0dh, 'Согласные символы в массиве присутствует: ','$'
foundtime db ?        ; количество наиденных элементов
fnd db ' шт.',0ah,0dh,'$'
.code
ASSUME ds:@data, es:@data
main:
    mov ax, @data
    mov ds, ax
    mov es, ax
    lea di, sogl
    xor al, al
    mov si, 0        ; si - столбцы в матрице
    mov bx, 0        ; bx - строки в матрице
    mov cx, 3        ; число для внешнего цикла (по строкам)
external:            ; внешний цикл по строкам
    push cx            ; сохранение в стеке счетчика внешнего цикла
    mov cx, 3        ; число для внутреннего цикла (по столбцам)
    mov si, 0
iternal:                ; внутренний цикл по столбцам
    mov al, string[bx][si]    ; в аl первый (очередной) элемент матрицы
    inc si            ; передвижение на следующий элемент в строке
    cld            ; ;брос флага df
    lea di, sogl        ; загрузка в es:di смещения строки
    mov X, cx
    mov cx, 20        ; для префикса repne - длина строки
    ;поиск в строке (пока искомый символ и символ в строке не совпадут)
    repne scasb sogl
    je found            ; если равны
    jmp notfound        ; если не равны
found:    inc foundtime        ; увеличиваем счетчик совпавших
notfound:            
    mov cx, X
    loop iternal        ; цикл внутренний
move_next:            ; продвижение в матрице
    pop cx            ; восстанавливаем СХ из стека
    inc bx            ; передвигаемся на следующую строку
    loop external        ; цикл внешний

    cmp foundtime, 0h    ; сравнение числа совпавших с 0
    ja eql            ; если больше 0, то переход
not_equal:            ; нет согласных а массиве
    mov ah, 09h        ; вывод сообщения на экран
    mov dx, offset failed
    int 21h
    jmp exit            ; на выход
eql:                ; есть элементы, совпавшие с искомым
    mov ah, 09h         ; вывод сообщений на экран    
    mov dx, offset success
    int 21h
    mov ah, 02h
    mov dl, foundtime
    add dl, 30h
    int 21h
    mov ah, 09h
    mov dx, offset fnd
    int 21h
exit:                ; выход
    mov ax, 4c00h        ; стандартное завершение программы
    int 21h
end main            ; конец программы
[/more]
Посмотрите, пожалуйста, к строке repne scasb sogl ассемблер выдает ошибку Must have instruction after prefix. Подскажите, что делать.
Автор: Abs62
Дата сообщения: 17.10.2010 18:40
DeadStrelok

Цитата:
Подскажите, что делать.

Прочитать, что делает команда scasb, и выкинуть из этой строки лишнее.
Автор: DeadStrelok
Дата сообщения: 17.10.2010 19:38
Спасибо, уже уладил эту проблему)
Но у меня есть еще проблемка: он считает както хренова. Пробовал с разными строками, получается то на больше, то нормально, то меньше. С данной строкой он считает на 1 элемент больше. Что не так?
[more=Код]
.MODEL small
.STACK 256
.data
string db 'abcdefghi'
sogl db 'bcdfghjklmnpqrstvwxz'
X dw ?
failed db 0ah,0dh, 'Нет согласных символов в массиве! ','$'
success db 0ah,0dh, 'Согласные символы в массиве присутствует: ','$'
foundtime db ?            ; количество наиденных элементов
fnd db ' шт.',0ah,0dh,'$'
.code
ASSUME ds:@data, es:@data
main:
    mov ax, @data
    mov ds, ax
    mov es, ax
    lea di, sogl
    xor al, al
    mov si, 0        ; si - столбцы в матрице
    mov bx, 0        ; bx - строки в матрице
    mov cx, 3        ; число для внешнего цикла (по строкам)
external:                ; внешний цикл по строкам
    push cx            ; сохранение в стеке счетчика внешнего цикла
    mov cx, 3        ; число для внутреннего цикла (по столбцам)
    mov si, 0
iternal:                ; внутренний цикл по столбцам
    mov X, cx
    mov cx, 20        ; для префикса repne - длина строки
    mov al, string[bx][si]    ; в аl первый (очередной) элемент матрицы
    inc si            ; передвижение на следующий элемент в строке
    ;cld            ; брос флага df
    lea di, sogl        ; загрузка в es:di смещения строки
    ;поиск в строке (пока искомый символ и символ в строке не совпадут)
    repne scas sogl
    je found            ; если равны
    jmp notfound        ; если не равны
found:    inc foundtime        ; увеличиваем счетчик совпавших
notfound:            
    mov cx, X
    loop iternal        ; цикл внутренний
move_next:            ; продвижение в матрице
    pop cx            ; восстанавливаем СХ из стека
    inc bx            ; передвигаемся на следующую строку
    loop external        ; цикл внешний

    cmp foundtime, 0        ; сравнение числа совпавших с 0
    ja eql            ; если больше 0, то переход
not_equal:            ; нет согласных а массиве
    mov ah, 09h        ; вывод сообщения на экран
    mov dx, offset failed
    int 21h
    jmp exit            ; на выход
eql:                ; есть элементы, совпавшие с искомым
    mov ah, 09h         ; вывод сообщений на экран    
    mov dx, offset success
    int 21h
    mov ah, 02h
    mov dl, foundtime
    add dl, 30h
    int 21h
    mov ah, 09h
    mov dx, offset fnd
    int 21h
exit:                ; выход
    mov ax, 4c00h        ; стандартное завершение программы
    int 21h
end main            ; конец программы
[/more]
Ни ошибок ни предупреждений ассемблер не выдает.
Автор: bomzzz
Дата сообщения: 18.10.2010 03:59
ты бы как то в расчете на аудиторию задавал вопросы, самое трудное разбираться в чужом коде, проще самому написать. а у тебя вопрос фактически относится ко всему алгоритму.
ошибка в алгоритме. чтоб ее найти надо задать такие задания, чтоб по ответу сообразить, зная алгоритм где примерно ошибка чтоб сузить круг поиска.
Автор: Prober
Дата сообщения: 18.10.2010 05:27
DeadStrelok
В коде
pop cx ; восстанавливаем СХ из стека
inc bx ; передвигаемся на следующую строку
loop external ; цикл внешний

вместо inc bx надо add bx, 3 (количество элементов в строке).
Автор: DeadStrelok
Дата сообщения: 18.10.2010 13:01
Prober
Спасибо, теперь все работает))

У меня еще вопрос: как можно вывести русские строки на экран? А то вместо них получаются иероглифы...
Автор: bomzzz
Дата сообщения: 18.10.2010 16:30
в текст программы перед компиляцией все строки ввести в дос кодировке. ну и в системе должна быть установлена русская кодировка 866

Добавлено:
http://www.alonewolfsoft.narod.ru/page04.htm
DosWinConverter
Конвертер формата текстовых файлов

Добавлено:
Автор: DeadStrelok
Дата сообщения: 18.10.2010 17:37
bomzzz
Хе проще писать на английском)) Но всеж спасибо за информацию))
Автор: bomzzz
Дата сообщения: 18.10.2010 17:40
да ниче сложного. или работай под досом. тогда сразу все в этой кодировке будет. или эммулятор только такую понимает.

Добавлено:
в эмуляторе удобный редактор кода с подстветкой, возможностью закомментировать блок и прочим. только ты вроде на масме пишешь, а там фасм такой хитрый что и тасм понимает и масм, но могут быть разночтения

Добавлено:
тут еще и макросы есть, ни разу не пользовался
Автор: A1exSun
Дата сообщения: 20.10.2010 15:54
Ассемблер 80.
Как поменять местами операнды, которые находятся в ячейках памяти за адресами 8100h и 8101h?

Добавлено:
Разобрался, вопрос закрыт
Автор: A1exSun
Дата сообщения: 24.10.2010 20:15
Нужно написать прогу которая заполнит массив B неотрицательными числами из массива A.

Перебирать числа из массива и проверять их знак я научился, а как заносить их в массив B? Какой командой?
Автор: bomzzz
Дата сообщения: 24.10.2010 20:17
mov.
Автор: YuriyRR
Дата сообщения: 29.10.2010 01:40
У кого нибудь есть инфа по 64 битному ассемблеру?
Автор: bomzzz
Дата сообщения: 29.10.2010 01:53
ну как бы компилятор нужен 64 битный, а вот особый он по сути даже не знаю

Добавлено:
http://www.xakep.ru/magazine/xA/083/118/1.asp

Добавлено:
да все видать точно также только можно регистры использовать не только: ah al ax eax а еще какие то aeax
Автор: YuriyRR
Дата сообщения: 29.10.2010 13:43

Цитата:
bomzzz

Интересует асм для чистого 64 битного режима где можно использовать новые регистры, а не режим совместимости.
Автор: bomzzz
Дата сообщения: 29.10.2010 14:24
ни у кого почти нет этих 64 бит. компилятор скачай 64 битный
Автор: DeadStrelok
Дата сообщения: 31.10.2010 16:28
У меня такой вопрос: как ввести массив вещественных чисел?
Автор: bomzzz
Дата сообщения: 31.10.2010 16:34
ну так и создать. задать "одномерный массив" - обычную строку и обрабатывать ее как массив нужной мерности
Автор: Benchmark
Дата сообщения: 31.10.2010 16:39
YuriyRR

Цитата:
Интересует асм для чистого 64 битного режима где можно использовать новые регистры


Что имеется в виду под "чистым 64-битным режимом" ? Под какой ОС - Windows, Linux, какой-то еще ? В том же дистрибутиве FASM есть папка с несколькими примерами.
Автор: DeadStrelok
Дата сообщения: 31.10.2010 16:40
bomzzz
Мне нужно ввести с клавиатуры в массив отрицательные и дробные числа, например -1.2. Как это сделать?
И как вывести его на монитор?
Автор: bomzzz
Дата сообщения: 31.10.2010 21:10
если 16 битный ассемблер вот скачай эммулятор тут все примеры есть

http://www.emu8086.com/ ключ в инете

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

Предыдущая тема: .NET GUI компоненты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.