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

» Assembler

Автор: pavel941
Дата сообщения: 30.03.2007 14:43
Где взять файлы *.lib для папки /LIB ???
Windows XP, P4

Я, только начинаю изучать Assembler.
Скачал бесплатно MASM32 v.9 из Internet.
После установки – папка /LIB оказалась пустой.
Написал программу с двумя функциями: MessageBox, ExitProcess.
Создается только файл *.obj
Автор: akaGM
Дата сообщения: 30.03.2007 15:16
pavel941

Цитата:
Где взять файлы *.lib для папки /LIB ???

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


Цитата:
Создается только файл *.obj

масм -- это компилятор, он создаёт объектники, исполнимые файлы делает линкер...
тебе подойдёт любой микрософтный, наверняка он лежит в /bin
Автор: HRyk
Дата сообщения: 30.03.2007 19:31
Друзья, помогите разобраться.
1) почему при запуске программы не виден курсор???
a segment
org 100h
assume cs:a,ds:a
begin: mov ax,0001h
    int 33h

     mov ax,0003h
     int 33h
 ct:    mov ah,01h
    int 21h
    cmp al,'a'
    je fin
    jmp ct
    
fin:    int 20h
a ends
    end begin     


2) если у кого есть время, доработайте мою програмку, плз!
задача такая: при работе программы в не зависимости от нажатия на клавиши мыши, выводить hello, при нажатии на одну из клавиш мыши, если курсор вне окна,выводить 'ura' , если в окне, осуществлять выход из программы:

s    segment
    org 100h
    assume cs:s,ds:s
begin:
    mov    ah,06h ;задание окна1
    mov    bh,31h
    mov    ch,5
    mov    cl,5
    mov    dh,10
    mov    dl,10
    int    10h
        
        
    mov     ax,0001h        ;видимость курсора
    int     33h

next:
    mov ax,0003h
    int 33h
    and bx,3h    
    cmp bx,1
    je key1            ;бит0=1 -нажата левая клавиша
    cmp bx,2        ;бит1=1 - нажата правая клавиша
    je key2            
    jmp next

key1:    mov ah,09h        ;вывод Hello
    lea dx,s1
    int 21h
we:    mov    ax,0003h    ;для синхронизации
    int    33h
    and    bx,1
    cmp    bx,1
    je    we        ;для синхронизации
    jmp next

    
key2:    

            mov    ax,0003h ;определить положение курсора
            int    33h ;cx- x dx- y bx- состояние клавиш

        and    bx,2h
            cmp    bx,2
            jne    wne
    
        pro1:    cmp    cx,40     ;бит0=1-нажата левая б1=1-правая    
            jle    wne
            cmp    cx,80
            jge    wne
            cmp    dx,40
            jle    wne
            cmp    dx,80
            jge    wne
                
            jmp    wix
            
            
        wne:    mov    ah,09h
            lea    dx,s2
            int    21h        
        
we1:
    mov    ax,0003h    ;для синхронизации
    int    33h
    and    bx,2
    cmp    bx,2
    je    we1        ;для синхронизации
    jmp next

        wix:    mov    ax,0002h ;отключить курсор
            int    33h
            
            int    20h

int 20h
s1    db    'hello','$'
s2    db     'leto','$'
s    ends
    end begin
Автор: akaGM
Дата сообщения: 30.03.2007 19:48
HRyk
нормальная программа, нормально работает...
только надо корректно линкануть, раз уж com-формат попросил...
Автор: HRyk
Дата сообщения: 30.03.2007 19:55
akaGM, по поводу первой задачи: при запуске у меня комп, будто зависает!!! не реагирует ни на что!!! хотя в коде ошибок я вроде не вижу. Это не может быть причиной "некоректной работы" Windows???
Автор: akaGM
Дата сообщения: 30.03.2007 20:18
HRyk
ты сделал exe или com?
твой код написан под ком-формат...

для ехе надо убрать org 100h и заменить int 20h на mov ax, 004ch; int 21h

и вообще убери из кода
Код:
mov ax,0001h
int 33h

mov ax,0003h
int 33h
Автор: HRyk
Дата сообщения: 30.03.2007 22:23
akaGM, порядок, отладил программу, завтра пойду сдаваться Это мой первый опыт при работе с мышью...
Автор: Lyrik
Дата сообщения: 30.03.2007 22:47
akaGM
имхо, некорректность

Цитата:
mov ax, 004ch; int 21h

надо mov ax, 4c00h; int 21h. я не спорю ah=00h, тоже прерывает программу, но в ней CS=segment to PSP, что, как понимаете, не всегда удовлетворяет.
Автор: akaGM
Дата сообщения: 31.03.2007 13:11
Lyrik
кто бы спорил...
хорошо, что ещё вообще что-то помню...
Автор: Novopolotsk
Дата сообщения: 07.04.2007 13:50
Здраствуйте помогите плиз решить задачку:

1. Написать программу на ассемблере,выполняющую арифмитические операции над целочисленными данными согласно заданиям,приведённым ниже. Общие требования:

--вид буфера для хранения массива и адресация в нем выбирается самостоятельно;
--числовые данные вводятся с клавы в виду строк символов(по умолчанию используется 10с/с),при этом производится проверка на переполнение(по умолчанию на знаковые 16 битные данные);
--константы задавать с помощью директивы EQU:;
--вычисления проверять на возникновение ошибок и переполнений;
--старт программы,ввод-вывод данных и обработку ошибок оформлять выводом в консоли поясняющих строк.
2. Реализовать основной алгоритм обработки как процедуру на языке ассемблера ,ввод-вывод данных и вызов процедуры реализовать в системе программирования Turbo C как головную программу.
ЗАДАНИЕ:
сформировать матрицу целых чисел (размер матрицы 5х6 элементов) и найти суммы элементов строк

Заранее спасибо
Автор: Rush
Дата сообщения: 07.04.2007 16:22
Уважаемые, вот какой вопрос: на работе нужно шифровать файлы (простенько). Самое простое - XOR.
Сделал я программку на VB. Все хорошо, но работает медленно (естественно, ведь на то он и VB).
Но это все лирика. Надо мне внедрить в программу функцию на ассемблере. Я такую нашел, но она
русские символы портит. Поскольку я в нем ничего не понимаю, прошу - найдите пару минут, поправьте.
Собственно, нужен откомпилированный bin-файл.
Лежит здесь - http://www.filespace.org/Rush/xor.zip
Автор: akaGM
Дата сообщения: 07.04.2007 17:23
что значит "портит"?
dos -- win1251 кодировка что ли?
тогда вряд ли что можно сделать... или-или...
Автор: Novopolotsk
Дата сообщения: 07.04.2007 18:59
Скажите плиз хотя бы как сделать ввод чисел в двумерный массив
Автор: akaGM
Дата сообщения: 07.04.2007 19:34
кстати, я глупость сказал, без разницы какая кодировка, всё должно корректно xorиться и восстанавливаться...

Цитата:
Скажите плиз хотя бы как сделать ввод чисел в двумерный массив

а на фиг тебе это на ассемблере?


Код:
N equ 3
M equ 4

array db N*M dup (0)
Автор: Rush
Дата сообщения: 07.04.2007 19:50
akaGM

Цитата:
что значит "портит"?
dos -- win1251 кодировка что ли?

Нет. Часть русских символов отображается вполне нормально.

Цитата:
тогда вряд ли что можно сделать... или-или...

И почему вряд ли что-то тогда можно сделать? Я, например, на том же бейсике сделал все без проблем. Любой двоичный файл зашифровывается/расшифровывается без ошибок. Только вот время...

Добавлено:
akaGM
Сперва послал мессагу, потом только твою прочитал...

Цитата:
без разницы какая кодировка, всё должно корректно xorиться и восстанавливаться...

Правильно, конечно. Но если при этом оставаться в двоичных пределах...
Автор: akaGM
Дата сообщения: 07.04.2007 20:07
Rush

причём тут двоичные пределы?
какая разница в каком представлении число...
10 xor 120 = 114
114 xor 120 = 10


Цитата:
Я, например, на том же бейсике сделал все без проблем

ну так ошибка в твоей асм-программе...
Автор: Rush
Дата сообщения: 07.04.2007 20:25
akaGM

Цитата:
причём тут двоичные пределы?

Так ведь за 255 выйдешь, назад в то же место не вернешься. А если прописать дополнительные условия, то это очень даже возможно.
Автор: Lyrik
Дата сообщения: 07.04.2007 21:13
Rush

Цитата:
Так ведь за 255 выйдешь

Если xor'ишь байты? Или что? Что-то ниче не пойму %)
Операция xor - побитовая, т.е. i-тый разряд результирующего числа зависит от i-тых разрядов исходных чисел, но не зависит не от i+1, не от i-1.
А то, что у тя работает медленно на барсике, то это не повод переписывать на асм довольну простое кодирование. Просто попытайся усовершенствовать свой алгоритм на барсике, т.е. например увеличь буфер, который ты xor'ишь и т.д.
Автор: Novopolotsk
Дата сообщения: 08.04.2007 01:50

Цитата:
а на фиг тебе это на ассемблере?

Лаба такая...

А как сделать ,чтобы с клавы можно было вводить значения???
Только по заданию сказано,что надо ввести массив как строку.
В прочем задание ниже написанно:

Цитата:
Здраствуйте помогите плиз решить задачку:

1. Написать программу на ассемблере,выполняющую арифмитические операции над целочисленными данными согласно заданиям,приведённым ниже. Общие требования:

--вид буфера для хранения массива и адресация в нем выбирается самостоятельно;
--числовые данные вводятся с клавы в виду строк символов(по умолчанию используется 10с/с),при этом производится проверка на переполнение(по умолчанию на знаковые 16 битные данные);
--константы задавать с помощью директивы EQU:;
--вычисления проверять на возникновение ошибок и переполнений;
--старт программы,ввод-вывод данных и обработку ошибок оформлять выводом в консоли поясняющих строк.
2. Реализовать основной алгоритм обработки как процедуру на языке ассемблера ,ввод-вывод данных и вызов процедуры реализовать в системе программирования Turbo C как головную программу.
ЗАДАНИЕ:
сформировать матрицу целых чисел (размер матрицы 5х6 элементов) и найти суммы элементов строк

Заранее спасибо


Автор: Rush
Дата сообщения: 08.04.2007 02:48
Lyrik

Цитата:
А то, что у тя работает медленно на барсике, то это не повод переписывать на асм довольну простое кодирование. Просто попытайся усовершенствовать свой алгоритм на барсике, т.е. например увеличь буфер, который ты xor'ишь и т.д.

Ну почему же. Как не пытыйся усовершенствовать за ассемблером не угонишься. Если на бесике 10 мб файл обрабатывается у меня за 16 секунд, то здесь за 1 секунду.
И вряд ли тут что-то изменишь...
Автор: MaxIkar
Дата сообщения: 26.04.2007 22:37
Приветствую всех!
У меня проблема.
Имеется задача (Win32):
Создать приложение-ревизор, осуществляющее постановку на учет и последующую проверку файлов на предмет модификации (контроль целостности) с помощью подсчета контрольной суммы файла (CRC) и последующего сравнения с хранящимся эталоном.
Замечание. Необходимо реализовать механизм, регистрирующий модификацию одного бита.
Интерфейс пользователя необходимо создать в среде Delphi, механизм проверки целостности файла реализовать на языке Assembler (ассемблерные вставки).

Проблема именно с ассемблерной составляющей.
У самого такие идеи: писать ассемблерными вставками в Delphi, сделать dll или включить в состав проекта obj-файл с процедурами.
В архиве http://www.thequietplace.net/godstower/asm.rar
+ один рабочий алгоритм (working), там одна асмовская процедура, в которую всключена готовая таблица crc.
+ dos - 3 досовские
+ yurov - чистый ассемблер
+ my - попытка заставить алгоритм Юрова работать под win32

В чем заключается проблема?
Рабочий алгоритм вычисляет другую crc (подозреваю, что там используется другой полином) чем досовкие варианты.
И мне кажется, что лучше использовать не готовую таблицу, а генерировать ее, как это сделано у Юрова.
Что я и попытался сделать. Но у меня ничего не выходит. Пока попытался проинициализировать таблицу (InitTbl), храня ее в глобальном массиве. Дальше же хотел заюзать нижнюю часть алгоритма но учитывая то, что файл буду читать кусками и надо накапливать уже вычисленную crc.
Пытался это оформить dll (думаю, что это хорошая практика на будущее - потом использовать код в других проектах), но и из этого ничего не вышло.
Может кто-нибудь даст советы по поводу портирования 16-битного кода в 32-битный и использования его в Delphi?
Интересует все: от того, как передавать параметры до того, какого типа лучше брать переменные, как хранить данные.

Спасибо
Автор: tar111
Дата сообщения: 09.05.2007 14:15
Уважаемая публика! Есть ли на данном форуме обсуждение проблем MASM32 в Windows? Самостоятельно, увы, не нашел. За подсказку заранее и искренне благодарю!
Автор: Rush
Дата сообщения: 10.05.2007 13:01
tar111

Цитата:
Есть ли на данном форуме обсуждение проблем MASM32 в Windows?

Кроме этой темы по ассемблеру нет ни одной, сколько-нибудь достойной упоминания. Да и эта еле дышит.
Можешь убедиться сам:
http://forum.ru-board.com/forum.cgi?action=filter&forum=33&filterby=topictitle&word=assemb
http://forum.ru-board.com/forum.cgi?action=filter&forum=33&filterby=topictitle&word=asm
http://forum.ru-board.com/forum.cgi?action=filter&forum=33&filterby=topictitle&word=%E0%F1%F1%E5%EC%E1%EB
http://forum.ru-board.com/forum.cgi?action=filter&forum=33&filterby=topictitle&word=%E0%F1%EC
Автор: klad84
Дата сообщения: 15.05.2007 10:19
Сестре задали задачу на Ассемблеру, я ей помоч не смог, но по-моему, она не сложная:
Найти сумму массива данных.(при условии, что переполнения не происходит). Предварительно занести в область памяти несколько небольших чисел.
Автор: Argogo
Дата сообщения: 16.05.2007 20:56
klad84
А по подробнее: как задается массив - в теле программы, или вводом с клавиатуры, в последнем случае - какова длина массива, фиксированная или вводится с клавы; че суммируем? байты, слова или как? Уточни область вводимых значений.

Под DOS или WIN32?
Автор: klad84
Дата сообщения: 21.05.2007 10:26
Argogo

Цитата:
А по подробнее: как задается массив - в теле программы, или вводом с клавиатуры, в последнем случае - какова длина массива, фиксированная или вводится с клавы; че суммируем? байты, слова или как? Уточни область вводимых значений.
Под DOS или WIN32?


массив задается вводом с клавиатуры;
длина массива фиксированная, не менее 5 элементов;
суммируем элементы получившегося массива;
складываем цифры, которые записаны в ячейках массива;
область вводимых значений - 0-100 (цифры)
под Window's
Автор: Argogo
Дата сообщения: 21.05.2007 21:20

Цитата:
длина массива фиксированная, не менее 5 элементов;

Не менее или не более?
Если не более - проблем, теоретически нет, при условии ввода чисел от 0 до 100.
Автор: klad84
Дата сообщения: 31.05.2007 07:37

Цитата:
Не менее или не более?
Если не более - проблем, теоретически нет, при условии ввода чисел от 0 до 100.


Можно и не более - условие все тоже (от 0 до 100)
Автор: SPY
Дата сообщения: 31.05.2007 12:46
Ребят, сможете подкорректировать мою прогу (лаба)?
написал тут кое-что, а не работает как нужно..
уже запарился, честно..

[more=КОД]
Код: ;Лабораторная работа №3.
;ТЕМА: Ввод-вывод и арифметическая обработка числовых данных.

;ЗАДАНИЕ: Написать программу, выполняющую
; -ввод массива целыx многозначныx чисел со знаком. При вводе осуществляется контроль допустимости вводимыx символов. Ввод предваряется текстовым приглашением.
; -арифметическую и логическую обработку массива чисел по заданию преподавателя.
; -преобразование числового результата в ASCII-строку и отображение на дисплее.

;Индивидуальное задание: (#1)Разделить сумму исходных чисел на максимум из положительных.

    
.MODEL SMALL            ;определение модели памяти
.stack 100h            ;сегмент стека размером в 256 байт

;pointer macro a,b,c         ;положение курсора
;    mov ah,02         ;bh=номер видеостраницы, dh=строка курсора, dl=столбец курсора.
;    mov bh,a
;    mov dh,b
;    mov dl,c
;    int 10h
;endm

input_string macro ist        ;ввод строки символов
    push ax
    push dx
    mov dx,offset ist
    mov ah,0Ah
    int 21h
    pop dx
    pop ax
endm

Out_string macro ost        ;вывод сообщений на экран
    push ax
    push dx
    mov dx,offset ost
    mov ah,9
    int 21h
    pop dx
    pop ax
endm


.data
mess1 db 'Input the number (-29999;+29999): $' ;приглашение ввода числа
mess_err1 db '<< Input error! >>$'        ;сообщение "Ошибка ввода"
mess_err2 db '<< Buffer overflow! >>$'        ;сообщение "Переполнение буфера"
mess2 db 'The sum total of input numbers: $'     ;сообщение "Сумма исходных чисел"
mess3 db 'Maximum of positive number: $'    ;сообщение "Максимум из положительных"

numbb label byte                ;массив трактуется как байтовый
numbers db 7,?,7 dup(0)            ;вводимые числа
massiv dw 5 dup(0)                ;массив уже введеных чисел
SumTot dw 0,'$'                 ;сумма исходных чисел
MaxPos dw 0,'$'                    ;максимум из положительных
Result dw 0,'$'                    ;результат деления
flag_error EQU 1                ;константа = флаг ошибки
out_str db 6 dup(' '),'$'
perev db 0dh,0ah

.code
Start:
mov ax,@data                     ;связь регистра DS с сегментом данных через AX
mov ds,ax

;Видеосервис. Вызов Функции 0(ah), режим 3(al), очистка экрана.
mov ah,00
mov al,03
int 10h

;цикл ввода
    xor di,di         ;di - номер числа в массиве
    mov cx,5         ;в cx - размер массива
input:    
    push cx
label_1:
    Out_string mess1
    input_string numbers
    Out_string perev
    call DIAPAZON
    cmp bh,flag_error     ;сравним bh и flag_error
    je err1     ;если равен -> сообщение об ошибке ввода

    call DOPUST
    cmp bh,flag_error
    
    je err1

    call AscToBin
    inc di
    inc di
    pop cx
    loop input
    jmp label_2

err1: Out_string mess_err1
    Out_string perev
    jmp label_1


;здесь место для арифметической обработки
;например, процедуры получения суммы положительных, отрицательных, среднего, максимального
label_2:    
                    ;сумма исходных чисел
        xor si,si
        xor ax,ax
        xor bx,bx
        mov si,2
        mov cx,5
metka:    mov bx,offset [numbers+si]
        add ax,bx
        ;jo ovr
        inc si
        inc si
        loop metka
        mov SumTot,ax
        Out_string mess2
        call BinToAsc
        Out_string perev
        out_string SumTot
        
xor si,si
    mov cx,5
mov si,2
kkk:        mov ax,offset [numbers+si]
cmp ax,0
jle sled
cmp MaxPos,ax
jle sled
mov MaxPos,ax
        
sled: inc si
inc si
loop kkk
Out_string mess3
        Out_string perev
out_string MaxPos

        xor ax,ax
xor dx,dx
mov ax, SumTot
        sub dx,dx        
        div MaxPos    
        jo ovr
        mov Result,ax
        call BinToAsc
        Out_string perev        
        out_string Result
        jmp exit
        
    mov ax,SumTot        ;вывод результата на экран
    call BinToAsc
    Out_string out_str

    mov cx,6        ;очистка буфера вывода
    xor si,si
clear:    mov [out_str+si],' '
    inc si
    loop clear

    mov ax,MaxPos    
    call BinToAsc
    Out_string out_str

;вывод остальных результатов - аналогично, лучше организовать цикл
;...

    jmp quit
ovr:    Out_string mess_err2    ;вывод сообщения о переполнении
quit:mov ah,7        
    int 21h
    
    mov ax,4C00h        ;системный вызов DOS 4Ch: в АН помещается 4Ch, в AL - код возврата
    int 21h

Wait_key proc            ;процедура ожидания нажатия клавиши
mov ah,10h
int 16h
ret
Wait_key endp

DIAPAZON proc            ;проверка диапазона вводимых чисел (-29999;+29999)
                ;буфер ввода - numbers
                ;через bh возвращается флаг ошибки ввода.
xor bh,bh
    cmp [numbers+1],5    ;если ввели менее 5 символов проверим их допустимость
    jb dop

    cmp [numbers+2],2dh    ;если ввели 5 или более символов, проверим является ли первый минусом "-"
    jne plus        ;если первый символ не "-", тогда проверим число символов

    cmp [numbers+1],6    ;если первый символ "-", а символов меньше 6 проверим допустимость символов
    jb dop
    jmp first         ;иначе проверим первую цифру

plus: cmp [numbers+1],6     ;введено 6 символов и первый символ не "-", тогда ошибка.
    je error1         ;ошибка!
first: cmp [numbers+2],32h     ;сравним первый символ с "2"
    jna dop             ;если первый <=2 - проверим допустимость символов
error1:    mov bh,flag_error     ;bh = flag_error

dop:    ret
DIAPAZON endp


DOPUST proc            ;проверка допустимости вводимых символов
                ;буфер ввода - numbers
                ;через bh возвращается флаг ошибки ввода, si - номер символа в строке
    xor bh,bh
xor ah,ah
    xor ch,ch
    mov si,2
    mov cl,[numbers+1]    ;в cl количество введенных символов
over:    mov al,[numbers+si]    ;в al - первый и последующие символы
    cmp al,2dh        ;является ли символ минусом
    jne testdop        ;если не минус - проверка допустимости
    cmp si,2        ;если минус - является ли он первым символом
    jne error2        ;если минус не первый - ошибка!
    jmp lower
testdop:            ;является ли введенный символ цифрой
    cmp al,30h
    jb error2
    cmp al,39h
    ja error2
lower:    inc si
    loop over
    jmp exit

error2:    mov bh,flag_error    ;при недопустимости символа bh = flag_error
exit:    ret    
DOPUST endp


AscToBin proc            ;преобразование строки в число
                ;в cx количество введенных символов
                ;в bx - номер символа начиная с последнего
                ;буфер чисел - massiv, в di - номер числа в массиве
    xor ch,ch
    mov cl,[numbers+1]
    xor bh,bh
    mov bl,cl
    dec bl
    mov si,1         ;в si вес разряда
n1:    mov al,[numbers+2]+bx
    xor ah,ah
    cmp al,2dh        ;проверим знак числа
    je otr         ;если число отрицательное
    sub al,30h
    mul si
    add [massiv+di],ax
    mov ax,si
    mov si,10
    mul si
    mov si,ax
    dec bx
    loop n1
    jmp n2

otr:    neg [massiv+di]        ;представим отрицательное число в дополнительном коде
n2:    ret
AscToBin endp
        
    
BinToAsc PROC            ;преобразование числа в строку
                ;число передается через ax
    xor si,si
    add si,5
    mov bx,10
    push ax
    cmp ax,0
    jnl m1
    neg ax
m1:    cwd
    idiv bx
    add dl,30h
    mov [out_str+si],dl
    dec si
    cmp ax,0
    jne m1
    pop ax
    cmp ax,0
    jge m2
    mov [out_str+si],2dh
m2:    ret
BinToAsc ENDP

end Start
Автор: Codename 539
Дата сообщения: 31.05.2007 18:13
вопрос:
вот код на си:

Код: void arraction(int a[],int b[],int size)
{
b[0]=a[0];
for(int i = 1;i<size;i++) b[i]=a[i]-a[i-1];
}

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

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


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