Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обсуждаются все вопросы, связанные с программированием на Ассемблере как общего так и конкретного характера.
 
важное примечание
для тех кто считает, что здесь место халявных исполнений курсовых и лабораторных работ.
тут обычно помогают тем, кто сам хоть что-то пытается понять и сделать, но что-то не понимает, что-то не получается...
ведь ассемблер изучают и задачки на нём дают обычно не менеджерам по продажам и даже не всем физ.-мат. специальностям
вы сами избрали этот путь? вот и идите по нему сами, ножками... с ручками и с головой...
 
короче, тут не сборище придурков-альтруистов, которым нечего делать и они ждут-не дождутся когда вы их попросите
что-то сделать _за_ вас
если позарез надо и вы даже готовы заплатить, тогда вам сюда
удачи
 
некоторые ресурсы
http://www.wasm.ru/ Самый популярный русскоязычный ресурс. https://wasm.in/
Ассемблер - книги (ASM, Assembler)
 
Просьба все большие листинги оформлять тегом more.
 
если вам вдруг не отвечают или ответ вас не устраивает
и вообще полезно прочитать всем спрашивающим

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:42 29-11-2006 | Исправлено: akaGM, 17:44 11-06-2020
GeMir



Ich finde dich
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
blaro

Цитата:
в dx поместить ax нельзя
там ворд, а там байт

Всего записей: 10296 | Зарегистр. 15-02-2004 | Отправлено: 18:11 13-02-2010 | Исправлено: GeMir, 18:26 13-02-2010
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GeMir

Цитата:
я закидываю в регистр ah нужный мне byte  
потом вызываю функцию cbw  
после её выполнения в регистре ah лежит мой word

Собственно, тут уже куча проблем. Команда cbw преобразует байт, лежащий в al в слово в ax с учётом знака. При чём тут закидывание байта в ah и как в восьмиразрядном регистре может лежать шестнадцатиразрядное слово - загадка.

Цитата:
соответственно, чтобы вывести эту фигню на экран  
засовываю инфу из ah в dx  

Как? ah - 8 разрядов, dx - 16.
Да и функция 2 int 21h выводит символ в dl, dh игнорируется.

Цитата:
а потом в ah кладу двойку и вызываю досовское прерывание  
а оно мне фигню пишет

Не-е, после cbw в ah уже не двойка, там либо 0, либо 0FFh.  
 
Что вообще сделать-то надо?


----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 18:15 13-02-2010
blaro



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
GeMir
Там кажется в АН передается номер команды а в AL адрес стороки. И CBW не надо.

Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 18:16 13-02-2010
GeMir



Ich finde dich
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62

Цитата:
Как? ah - 8 разрядов, dx - 16.

Упс, извиняюсь, не "ah" а "ax" имелся в виду.
Моя вина. "Трудности перевода".

Цитата:
Что вообще сделать-то надо?

Вот:

Цитата:
меня интересует вывод на экран word из регистра ax и конвертирование byte в word

Всего записей: 10296 | Зарегистр. 15-02-2004 | Отправлено: 18:27 13-02-2010 | Исправлено: GeMir, 18:35 13-02-2010
blaro



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вот нашел как надо

Код:
 
mov ah,2
mov dl, адрес_строки
int 21h
 

По другому только через порт видео карты.

Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 18:36 13-02-2010
Zminyty

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот, собственно, и "хороший человек", которому требуется помощь.
Значит, рассказываю по порядку, что я хочу сделать и для чего это нужно.Изначально у меня есть 2 перменные, одна байт, вторая - ворд.Задание:нужно выполнить арифметическое действие между этими перменными, соответственно нужно привести их к одному типу.
Значит, перменную а типа байт, я кладу в al -> a, cbw -> получаем в ах наш ворд.дальше я хочу вывести это на экран, а потом уже произвести действие.т.е. я не могу просто сделать mov dx,ax int 21h ?
 
что именно неправильно в этом куске?
 
mov al,a
cbw    
mov dx,word ptr ax
int 21h

Всего записей: 4 | Зарегистр. 13-02-2010 | Отправлено: 18:37 13-02-2010 | Исправлено: Zminyty, 18:42 13-02-2010
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Zminyty

Цитата:
т.е. я не могу просто сделать mov dx,ax int 21h ?

Сделать-то можно, вот только результат не порадует.

Цитата:
что именно неправильно в этом куске?

Дык, чтобы вывести число на экран его сначала надо в строку символов преобразовать, и её уже выводить.
Вот тут есть пример, как это делается: ПРЕОБРАЗОВАНИЕ ДВОИЧНОГО ФОРМАТА В ASCII-ФОРМАТ
 
И не забывать задавать номер функции в ah перед вызовом int 21h

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 18:57 13-02-2010
blaro



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Zminyty

Цитата:
mov al,a
cbw    
mov dx,word ptr ax
int 21h

1) Зачем писать CBW? Если только у тебя не отрицательные числа. Можно просто написать  
mov ah,00
mov al, a
 
2) Зачем писать mov dx, word ptr ax? Если АХ уже 16 байтов.  
 
Тогда делать нужно так

Код:
 
mov al,a
mov ah,2
mov dl,al
int 21h
 

Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 19:03 13-02-2010
Zminyty

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
blaro
 

Цитата:
Тогда делать нужно так  
 
Код:
 
mov al,a  
mov ah,2  
mov dl,al  
int 21h  
 
 

вы меня совсем за идиота не держите, пожалуйста.с обычным выводом на экран я уже разобралась.интересует именно мой случай.
 
Abs62
знаете, по ссылке уже пошли какие-то дебри ассемблера)и учитывая то, что это моя вторая лабораторная работа за 2 дня изучения ассемблера, то мне еще немного сложновато въехать в такоев общем, мне почему-то кажется, что существует более изящное решение моей проблемы

Всего записей: 4 | Зарегистр. 13-02-2010 | Отправлено: 19:11 13-02-2010
blaro



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Zminyty
Никто вас за идиота не держит. Таким способом которым вы хотите сделать это невозможно. Есть другой способ, вывести строку через порт видео карты. А та ссылка которую дал вам Abs62 тоже может быть полезной, но если то что там написанно вам не понятно оставте на потом.

Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 19:23 13-02-2010
Zminyty

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
хорошо,т.е. если я не буду вывосить свой ворд из ах, потом выполню арифметическую операцию над двумя числами и запишу результат операции в дополнительную, допустим, с переменную и мне понадобится её вывести на экран.здесь придётся переводить из двоичного представления в аски?я праивльно понимаю?
т.е. если у нас есть просто число в памяти, то в каком оно виде там хранится и почему мы можем обычным способом его вывести на экран, а вот после выполнения действий над числами приходится так мучаться с переводами?

Всего записей: 4 | Зарегистр. 13-02-2010 | Отправлено: 19:28 13-02-2010
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Zminyty

Цитата:
по ссылке уже пошли какие-то дебри ассемблера

Да нет там никаких дебрей.
Суть задачи вывода - преобразовать число вроде 1234 в последовательность символов '1','2','3','4', поскольку функции вывода работают именно с символами. Алгоритм: последовательно делим число на 10, остаток от деления даёт цифру, стоящую в очередном разряде.
1234/10=123, в остатке 4. Добавляем '0' (30h), получаем символ '4'. Заносим его в буфер, смещаем указатель.
123/10=12, в остатке 3. Добавляем '0' (30h), получаем символ '3'. Заносим его в буфер, смещаем указатель.
12/10=1, в остатке 2. Добавляем '0' (30h), получаем символ '2'. Заносим его в буфер, смещаем указатель.
1/10=0, в остатке 1. Добавляем '0' (30h), получаем символ '1'. Заносим его в буфер.
Теперь в буфере образовалась искомая строка '1234', которую осталось лишь вывести.
Что конкретно непонятно?

Цитата:
т.е. если у нас есть просто число в памяти, то в каком оно виде там хранится и почему мы можем обычным способом его вывести на экран

Хранится в двоичном виде и без преобразования его не вывести.
Простой пример:

Код:
mov ah,2  
mov dl,36h
int 21h

На экран будет выведена цифра '6', хотя в dl лежит десятичное число 54 (шестнадцатеричное 36).

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 19:46 13-02-2010
blaro



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Zminyty

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

Не обязательно.
 

Цитата:
если у нас есть просто число в памяти, то в каком оно виде там хранится

Если вы определили число как строку т.е. '12345' то в памяти это будет хранится так "31h 32h 33h 34h 35h", в остальных случаях как обычное шестнадцетиричное число.

Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 19:46 13-02-2010
Zminyty

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
 
ой да сам алгоритм понятен очень как.слава богу семестр компьютерной арифметики не зря прошелпросто страшно как-то всё так выглядит, да и не ф-ии знаю ассемблера.придется этим занятся уже на неделе, т.к. сейчас учу кое-что другое
 

Цитата:
На экран будет выведена цифра '6', хотя в dl лежит десятичное число 54 (шестнадцатеричное 36).

да это уже понятноспаисбо большоев принципе, очень неплохо разобралась
 
blaro

Цитата:
Если вы определили число как строку т.е. '12345' то в памяти это будет хранится так "31h 32h 33h 34h 35h", в остальных случаях как обычное шестнадцетиричное число.

и вам тоже спасибо

Всего записей: 4 | Зарегистр. 13-02-2010 | Отправлено: 20:32 13-02-2010
krserv



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
хотел  установить Masm 8 под XP SP3  - пишет необходим Visual C++ 2005 express - устнавливаю файл, скачанный с download center Microsoft vcredist86.exe - запускается установка 2005 express. Проходит нормально, но Masm - снова не устанавливается, выводит ту же ошибку, что нужен Visual C++ 2005 express.
Может нужен полный Visual 2005, у меня есть дистрибутив, но в нем нет одного файла - Setup.exe - пжс, залейте на файлообменник один этот файл, у кого есть.

Всего записей: 3728 | Зарегистр. 21-11-2006 | Отправлено: 22:10 15-02-2010
Crousader

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите разобарться пожалуйста. Нужно написать программу умножения 16-х чисел на 3. Скажите, пожалуйста, где базовая ошибка. Возможно, тут написан полный бред так как это моя первая программа на Ассемблере. Заранее спасибо!
Вот мой код:
masm
model   small
.data
 
  message       db  0dh,0ah,"VVedite chislo (16)"
  vuvod            db  0dh,0ah,"Resultat: $"
  end_question    db  0dh,0ah,"Hotite povtorit? ('y'- yes) $"
 
.stack 256
.code
 
 
 
convert_char:
        sub    al,'0'                ;вычитаем из символа ASCII-код нуля
        cmp    al,10                 ;если разность меньше 10, то была
                                     ;десятичная цифра - больше ничего не нужно
                                     ;делать
        jb     done                  ;команда JB - переход, если меньше
                                     ;иначе - была буква
        add    al,'0'                ;AL=исходная буква
        and    al,0x5f               ;приводим ее к верхнему регистру
        sub    al,'A'-10             ;получаем диапазон от 10
        and    al,0x0f               ;вернуть нужное значение 0-15. Если
                                     ;буква больше F, то
                                     ;очищаем 4 старших бита AL
        done:
        ret                          ;возвращаемся
 
 
 
HexDigit:
        cmp    dl,10
        jb     .less
        add    dl,'A'-10
        ret
   .less:
        or     dl,'0'
        ret
 
 
main  proc                           ;початок процедури main
        mov    ax,@data              ;фізична адреса сегмента даних в регістр ах
        mov    ds,ax                 ;ах записуємо в ds  
vvod:      
        mov    ax,0003h              ;очистка екрану
    mov    dx,offset message     ;загрузка адреси строки message
        int    21h                   ;вивід запрошення до вводу
        push   esi                   ;сохраняем указатель в стеке
        xor    eax,eax               ;EAX = 0
        xor    ebx,ebx               ;EBX = 0: накопитель для числа
        cmp    byte [esi],'-'        ;число отрицательное?
        jnz    .next                 ;если нет, не пропускаем следующий
                                     ;символ
        inc    esi                   ;пропускаем символ '-'
  .next:
        lodsb                        ;читаем цифру в AL
        or     al,al                 ;конец строки?
        jz     .done
        call   convert_char          ;преобразовать в число и сохранить
                                     ;его в AL
        imul   ebx,16                ;умножить EBX на 16, сохранить в EBX
        add    ebx,eax               ;сложить
        jmp    short .next           ;и повторить
  .done:
        xchg   ebx,eax               ;поместить накопленное число в EAX
        pop    esi                   ;восстановить исходное значение ESI
        cmp    byte [esi],'-'        ;результат должен быть отрицательным?
        jz     .negate               ;да, выполним отрицание
        ret
  .negate:
        neg    eax                   ;выполняем отрицание
        ret                          ;все!
       
        lea    eax,[eax*3]
 
        pushad
        xor    esi,esi
converted_loop:
        xor    edx,edx
        div    16
        call   HexDigit
        push   edx
        inc    esi
        test   eax,eax
        jnz    converted_loop
        cld
write_loop:
        pop    eax
        stosb
        dec    esi
        test   esi,esi
        jnz    write_loop
        mov    byte [edi],0
        popad
        ret
        jmp    end_cont              ;перехід до мітке end_cont
end_cont:
    mov    dx,offset end_question ;загрузка адреси строки end_question
    mov    ah,9
    int    21h                   ;вивід строки end_question на екран
    xor    ah,ah                 ;очистка ah
    mov    ah,01h
    int    21h                 ;ввід користувачем умови
    cmp    al,'y'                ;якщо натиснули "у"  
    je     vvod                 ;перехід в початок програми і повтор її дій
        mov    ax,4c00h
        int    21h                   ;завершеня програми
endp main
 end main

Всего записей: 13 | Зарегистр. 26-11-2007 | Отправлено: 00:13 03-03-2010
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Crousader

Цитата:
and    al,0x5f               ;приводим ее к верхнему регистру

or должно быть

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 21:45 15-03-2010
Sevand

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
люди помогите плиз, в ассамблере начинающий,можно сказать полный нубнемогу решить эти задачи
заранее оч благодарен
 
{y = |x-5|, если x > 0
{y = x(в квадрате)+4x-3, если x <=(меньше либо равно)0
 
x - должен быть в регистре C
y - должен быть в регистре D
 
а так же  
 
{y = (x-1)(в квадрате), если x > 1
{y = (x+1)(в квадрате), если x <=(меньше либо равно)1
 
x - должен быть в регистре C
y - должен быть в регистре D

Всего записей: 1 | Зарегистр. 18-03-2010 | Отправлено: 19:39 18-03-2010
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sevand

Цитата:
в ассамблере начинающий

а что ты "начал" _сам_ в своих задачах?

Всего записей: 24116 | Зарегистр. 06-12-2002 | Отправлено: 20:58 18-03-2010
aspis

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sevand

Цитата:
регистре C

Цитата:
регистре D

Таких регистров нет, может быть ecx, edx
 
Примерно так (только вычисление через сопроцессор выражений), ну а где/как их использовать и какой еще код нужен -на твое усмотрение.
Подробнее...

Всего записей: 87 | Зарегистр. 27-08-2007 | Отправлено: 21:52 18-03-2010
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru