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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
A1exSun



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Разобрался.

Всего записей: 1871 | Зарегистр. 25-11-2009 | Отправлено: 19:31 16-12-2010
Van_der_Vlaad



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, уважаемые форумчане.
 
Быстрая сортировка на ассемблере.
 
Вот алгоритм на паскале, который я переделывал под ассемблер. (стандартный алгоритм, с рекурсией)
Pascal QuickSort
 
А вот код на ассемблере (делал на TASM)
QuickSort Asm
 
Ошибка следующая - компиляция нормальная, при запуске вылетает с такой ошибкой
   
 
Смотрел в отладчике  - ошибка возникает где-то поздно, не на ранних циклах и рекурсии.
 
Если у вас возникнут вопросы по коду - задавайте, постараюсь объяснить что я там хотел сделать.
 
Также по следующей ссылке прикладываю сам компилятор TASM.
(Сама программа находится в файле prog.asm, просто скомпилировать - asm.bat, запустить - asm_debug.bat и нажать f9. ну а остальное стандартное, всякие f7, f8...)
http://ifolder.ru/20944619
 
Заранее спасибо за помощь!

Всего записей: 24 | Зарегистр. 23-08-2009 | Отправлено: 21:03 21-12-2010 | Исправлено: Van_der_Vlaad, 21:05 21-12-2010
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Van_der_Vlaad
какой у тебя предполагаемый интерфейс quicksort(),  quicksort([var] l_index, r_index: word)?

Код:
push 0             ; возможная ошибка - неправильные границы. (n-1 ?)
push n-1          ; n / n-1
call quicksort
push bp                 ; "Пролог"
mov bp,sp  
 
mov si,4
mov bx,[bp+si]

при таком стеке передаваемые параметры адресуются начиная с [bp+6] АФАИР из-за лишнего push bp в "прологе",
+ на тасме ты не указал модель вызова proc near или proc far (это два лишних байта на стеке)
можно делать директивой
.model
.386
 
совет#1:
возьми за привычку использовать в п/программах константы типа

Код:
quicksort proc far
LOCALS @@ ; например...
left_index EQU WORD PTR [BP+6]
right_index EQU WORD PTR [BP+8]
; или для локально-уникальных имён...
@@left_index EQU WORD PTR [BP+6]
@@right_index EQU WORD PTR [BP+8]
 
push bp                 ; "Пролог"
mov bp,sp
mov bx,right_index
;add si,2 это теперь не надо...
mov ax,left_index

+ к тому же код становится самокомментированным...
 
совет#2:
пиши на встроенном ассемблере в среде TP(BP/Delphi, где ты там сидишь?), а уже после того как отладишься, переноси в автоном...

Всего записей: 24112 | Зарегистр. 06-12-2002 | Отправлено: 21:30 21-12-2010 | Исправлено: akaGM, 21:52 21-12-2010
pavelkorr

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день, помогите пожалуйста написать программу. Принцип действия таков:
Программа запрашивает у пользователя ввод числа от 0 до 9, по окончанию ввода компьютер считывает значение секунды из CMOS (именно старшее значение, чтобы всегда было от 0 до 9). Компьютер сравнивает введённое пользователем значение со считанным из CMOS. В случае совпадения выводится сообщение типа "Ура! Вы угадали", в случае неудачи, соответственно, "Ура! Вы не угадали!"
 
Вот немного из набросков:

Код:
 
.model large
.386
.387
;------------------------ сегмент кода -------------------------------
.code                                   ; сегмент кода
        mov AX, @data
        mov DS, AX
        mov ES, ax
 
        lea DX, s1
 
        mov AH, 9h                      ; 09h - функция вывода на экран
        int 21h
 
        call in_out                     ; изучение команд работы с портами
        call fproc                      ; изучение команд матем. сопроцессора
 
        mov AH, 1h                      ; 01h - функция ожидания ввода с клавиатуры
        int 21h
 
 
        mov ax, 4c00h                   ; корректное завершение программы
        int 21h
        ret
 
fproc PROC near
        finit   ; инициализация сопроцессора
        fild word ptr zoom      ; загрузим в стек 50000
  ; здесь можно проверить правильность загрузки командой:  fbstp tbyte ptr decimal
        fldpi   ; pi,50000
        fldpi   ; pi,pi,50000
        fmul    ; pi*pi,50000
        fcos    ; cos(pi*pi), 50000
        fmul    ; 50000*cos(pi*pi)
        fld st(0) ;     copy    
        fst qword ptr myfloat ; сохраним в памяти как переменную типа double
        fbstp tbyte ptr decimal ; сохраним в памяти как десятичное целое
 
        lea si,numbers  ; вывод на экран десятичного числа
        lea di,decimal
        add di,9
 
        mov cx,10d
 
f_loop:  
        mov al,[di]
 
        mov ah,al       ; сделаем копию в ah
 
        shr al,4        ; обработка первого числа
        add al,'0'
        mov [si],al      ; сохранили
 
        and ah,00001111b
        add ah,'0'
        mov [si+1],ah     ; сохранили
 
        dec di
        add si,2
        dec cx
        jnz f_loop
 
        lea DX, math
        mov AH, 9h                      ; 09h - функция вывода на экран
        int 21h
 
 
        ret
fproc ENDP
 
;=====================================================================
;===          Процедура считывания из микросхемы CMOS текущего времени
;=====================================================================
 
in_out PROC near
 
PR_CMOS MACRO NUM,ADDR
        mov al,NUM      ; считаем из CMOS час
        lea si,ADDR
        call print_cmos
    ENDM
 
        mov al,0bh      ; подготовка к взаимодействию с микросхемой CMOS
        out 70h,al
        in al,71h
        and al,11111011b
        out 71h,al
 
        PR_CMOS 0h,secondh      ; считаем из CMOS старшую часть секунды
 
        lea DX, s_d
        mov AH, 9h                      ; 09h - функция вывода на экран
        int 21h
        ret
in_out ENDP
 
print_cmos PROC near
; входные параметры
; al - номер регистра CMOS
; si - адрес символьного буфера куда помещаем результат
 
        out 70h,al      ; считаем из CMOS
        in al,71h
 
        mov ah,al       ; сделаем копию в ah
 
        shr al,4        ; обработка первого числа
        add al,'0'
        mov [si],al      ; сохранили
 
        and ah,00001111b
        add ah,'0'
        mov [si+1],ah     ; сохранили
        ret
print_cmos ENDP
 
;-------------------------- Сегмент данных -------------------------
.data                                   ; сегмент данных
 
s_d    db 10,13,10,13,' Загаданное число: '  
 
secondh db ?,?
       db '$'
 

Всего записей: 1 | Зарегистр. 22-12-2010 | Отправлено: 12:47 22-12-2010
Van_der_Vlaad



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
Спасибо за помощь!
Попробовал исправить программу, теперь она выглядит так.
QuickSort
 
Добавилось вот это

Код:
 
quicksort proc near
LOCALS @@
L_ind EQU WORD PTR [BP+6]  
R_ind EQU WORD PTR [BP+4]

 
push bp                  
mov bp,sp  
 
;mov si,4
mov bx, R_ind          ; N   правая граница    (ah)bx         ;mov j,..
;add si,2
mov ax, L_ind         ; 1    левая граница (al)ax           ; mov i,....
   
mov i, ax
mov j, bx

 
Но с этим просто вылетает в определнный момент без всяких ошибок. (если правильно понял, то при отладке он что-то часто проверял кусок со 2 по 3ий элемент)
 
Почему не  

Код:
L_ind EQU WORD PTR [BP+6]  
R_ind EQU WORD PTR [BP+8]

потому что с этими значениями вылетает прям в первом проходе с делением на ноль.
 
с  

Код:
L_ind EQU WORD PTR [BP+4]  
R_ind EQU WORD PTR [BP+6]

 
он срабатывает, но массив не сортирует
 
 
Простите, если я туповат, но что я снова делаю не так? быть может у меня где то в самом алгоритме сортировки неточности?
 
П.с.

Цитата:
какой у тебя предполагаемый интерфейс quicksort(),  quicksort([var] l_index, r_index: word)

quicksort([var] l_index, r_index: word)  - предполагаю, что передаю два параметра в процедуру - границы проверяемого куска массива
 
и насчет лишнего push bp в прологе не очень понял, я его пробовал удалять, но в таком случае тоже программа не особо работает
 
 
 

Всего записей: 24 | Зарегистр. 23-08-2009 | Отправлено: 19:46 22-12-2010 | Исправлено: Van_der_Vlaad, 19:55 22-12-2010
Abs62



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

Цитата:
mov i, ax  
mov j, bx  

И что будет происходить с глобальными переменными i и j при рекурсивном вызове?

Код:
 
LOCALS @@ ; Это обычно пишется в самом начале программы - инструкция компилятору как трактовать все вхождения с @@
...
quicksort proc near  
@@L_ind EQU WORD PTR [BP+6]  
@@R_ind EQU WORD PTR [BP+4]  
 
@@i EQU WORD PTR [BP-2]  
@@j EQU WORD PTR [BP-4]  
 
push bp                  
mov bp,sp
sub sp,4 ; выделение места под локальные переменные @@i, @@j
...
mov @@i, ax  
mov @@j, bx  
...
 
 

Цитата:
и насчет лишнего push bp в прологе не очень понял,

Это сохранение оригинального значения bp на входе в процедуру, чтобы восстановить его на выходе.

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

Конечно, не работает - разве mov sp,bp правильно восстановит указатель стека, если bp был изменён при рекурсивном вызове? Всё ж наперекосяк пойдёт.

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

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 20:30 22-12-2010
Van_der_Vlaad



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

Всего записей: 24 | Зарегистр. 23-08-2009 | Отправлено: 21:04 22-12-2010
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Van_der_Vlaad
ещё надо "поправить стек" на два пуша переданных параметров:

Код:
...
end_proc:
mov sp,bp
pop bp
 
ret 4
quicksort endp


Всего записей: 24112 | Зарегистр. 06-12-2002 | Отправлено: 21:04 22-12-2010
Van_der_Vlaad



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

Цитата:
Abs62  
вот мой очередной вариант  
Quick  
Теперь вообще работа останавливается судя по отладчику в каких то дебрях (даже не в строках с кодом программы)  
 
Если не затруднит, то напишите, пожалуйста свою полную версию с этими переменными.  
А то я с ассемблером работал мало, а с этими переменными вообще первый раз сейчас работаю и представляю сколько у меня сейчас косяков.  
 
Спасибо.


Цитата:
ещё надо "поправить стек" на два пуша переданных параметров:

 
после изменения на ret 4 ничего не изменилось. (ошибка в первую очередь скорее всего в моей работе с @@... )

Всего записей: 24 | Зарегистр. 23-08-2009 | Отправлено: 21:08 22-12-2010
akaGM

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

Цитата:
после изменения на ret 4 ничего не изменилось.  

это одна _из_ ошибок...

Всего записей: 24112 | Зарегистр. 06-12-2002 | Отправлено: 21:30 22-12-2010
Abs62



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

Цитата:
а с этими переменными вообще первый раз сейчас работаю и представляю сколько у меня сейчас косяков.

Сравнительно немного.
Не столько с переменными, сколько с условиями. И в одном месте inc вместо dec.
Подробнее...

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

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 23:15 22-12-2010
Van_der_Vlaad



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ДА! РАБОТАЕТ!
Огромнейшее спасибо Abs62 и akaGM за проявленное терпение и помощь!

Всего записей: 24 | Зарегистр. 23-08-2009 | Отправлено: 17:50 23-12-2010
berkut9737



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, простите, если не по теме и если это так, направьте пож., в нужную ветку. Проблема вот в чём. Установил Assembler masm611 на Win-7. Установку делал по умолчанию, т.к, другой инструкции не нашёл. СМD и EDIT файлы работают. Написал по шаблону первую учебную программу, но, когда дело дошло до "слинковать объектные файлы", то дальше дело не пошло. Подскажите, пож., возможную причину. Второй день бьюсь лбом о стену, а воз и ныне там. Спасибо.

Всего записей: 1140 | Зарегистр. 05-04-2009 | Отправлено: 16:43 05-02-2011
bomzzz



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

Цитата:
 
ECHO OFF
COLOR 9F
CLS
REM C:\MASM611\BIN\ML.EXE NONAME.asm /link C:\MASM611\LIB\MYLIB.LIB
C:\MASM611\BIN\ML.EXE NONAME.asm /AT
pause
C:\MASM611\BINR\LINK.EXE NONAME.obj /t
pause
 

код в файле NONAME.ASM
 
Добавлено:
ошибки вылазят но компилиться. при установке не дал масму в системыне пути прописаться может поэтому. я в основном на тасм 4 все делал, только потом на масм 6.11 перебрался. не довел это дело до конца
 
 

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 16:48 05-02-2011
berkut9737



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

Всего записей: 1140 | Зарегистр. 05-04-2009 | Отправлено: 17:10 05-02-2011
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
не, надо было батник в папку положить с таким же путем как на картинки. или чтоб со стола запускать, тогда надо рабочий путь в батнике менять. но я когда пишу пользуюсь эмулятором поэтому уже конечный вариант только компилирую, поэтому у меня и батник в самом масме прижился
 
Добавлено:
http://www.emu8086.com/  вот очень пальзительная вечь для начинающих, ключ в инете. правда потом код для масма 6.11 придется незначительно подправлять, а вот тасм и фасм компилят в таком же видее как эмулятор

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 17:14 05-02-2011 | Исправлено: bomzzz, 17:15 05-02-2011
berkut9737



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bomzzz, т.е, работать в папке masm611? А вместо NONAME подставлять имена своих файлов в батнике?

Всего записей: 1140 | Зарегистр. 05-04-2009 | Отправлено: 17:17 05-02-2011
bomzzz



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

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 17:19 05-02-2011 | Исправлено: bomzzz, 04:27 06-02-2011
berkut9737



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bomzzz, спасибо! Буду пока переваривать вашу информацию и практиковать. Вернусь в тему просветлённым(надеюсь), чтобы продолжить обучение.
 
Добавлено:
bomzzz, уже качаю.

Всего записей: 1140 | Зарегистр. 05-04-2009 | Отправлено: 17:25 05-02-2011
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
http://bomz-co.narod.ru/tasm4.0.rar  пригодица в кулацком хозяйтсве
 
 

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 17:29 05-02-2011 | Исправлено: bomzzz, 04:27 06-02-2011
Открыть новую тему     Написать ответ в эту тему

Страницы: 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