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

» Assembler

Автор: praidik
Дата сообщения: 20.03.2011 14:43
Так как я не много понимаю, тема Ассемблер началась недавно...
Есть это...
Model small
Stack 256
data segment
num1 dw 2
num2 dw 3
rek dw 0
data ends
code segment
assume cs:code, ds:data
start:
mov ax, data
mov ds, ax
mov ax, num1
add ax, num2
mov rek, ax
pop cx
pop dx
pop bx
pop ax
Mov ax,@data
Mov ds,ax
Mov dx, offset rek
Mov ah, 09h
Int 21h
Mov ah, 1h
Int 21h
mov ah, 04ch
int 21h
code ends
end start

Теоретически она должна слаживать два числа и выводить результат на экран...
Помогите пожалуйста разобраться...
Автор: VGrad
Дата сообщения: 20.03.2011 20:15

Цитата:
Теоретически она должна слаживать два числа и выводить результат на экран...

Она и "слаживает" , но перед тем как отображать неплохо бы цифры конвертнуть в ASCII !
Автор: praidik
Дата сообщения: 21.03.2011 16:47
Можете ли помочь с решением проблемы?

Model small
stack 256
dataseg
numb1 db 3
numb2 db 2
codeseg
start:
mov ax, @data
mov ds,ax
mov ax, numb1
add ax, numb2
aaa
xchg al,ah
add ah, '00'
int 29h
mov al,ah
int 29h
Mov ah, 1h
Int 21h
mov ah, 04ch
int 21h
end start
Она должна сложить два числа и выести результат на экран...
При попытке компиляции выскакивают 3 ошибки:
**Error** qwe.asm(10) Operand types do not match
**Error** qwe.asm(11) Operand types do not match
**Error** qwe.asm(14) Constant too large
Автор: Benchmark
Дата сообщения: 21.03.2011 18:07
praidik

Цитата:
mov ax, numb1

Размерность регистра ax - 16 бит, numb1 - 1 байт, т.е. 8-битное число. Прокатит такое:
movzx ax, numb1


Цитата:
add ax, numb2

То же самое.


Цитата:
add ah, '00'

А теперь наоборот - к 8-битному регистру ты пытаешься добавить двухбайтовое (16-битное) число 0x3030
Автор: praidik
Дата сообщения: 22.03.2011 16:50
Benchmark

Цитата:
movzx ax, numb1

Попробовал...
Вылетает "I llegal instruction for curretly selected processor(s)"
Что не так?(
Автор: Benchmark
Дата сообщения: 22.03.2011 17:00
praidik

Цитата:
Вылетает "I llegal instruction for curretly selected processor(s)"

Инструкция movzx поддерживается, начиная с 386 процессора. Вот и выставь ему вначале:
.386

А еще лучше сразу .586, чтоб подобных ситуаций не возникало.
Автор: praidik
Дата сообщения: 22.03.2011 17:25
Benchmark
Благодарю.
Последний вопрос...
В каком виде записать
add ax, numb2??
Сори за глупые вопросы...
Автор: Benchmark
Дата сообщения: 22.03.2011 17:35
praidik

Цитата:
В каком виде записать
add ax, numb2??


Ну например

movzx bx, numb2
add ax, bx


или

add al, numb2
adc ah, 0
Автор: praidik
Дата сообщения: 22.03.2011 17:39
Получился такой код...
.586
Model small
stack 256
dataseg
numb1 db 3
numb2 db 2
codeseg
start:
mov ax, @data
mov ds,ax
movzx ax, numb1
movzx bx, numb2
add ax, bx
aaa
xchg al,ah
add ah, '0'
int 29h
mov al,ah
int 29h
Mov ah, 1h
Int 21h
mov ah, 04ch
int 21h
end start

Ошибок при компиляции нет, но не появляется EXE файл(( Появляются только obj и map.
Автор: Benchmark
Дата сообщения: 22.03.2011 17:45
praidik

Цитата:
Ошибок при компиляции нет, но не появляется EXE файл((

А ты чем компилируешь ?

Вообще после компиляции должен появиться .obj файл, который потом скармливается линкеру.
Автор: praidik
Дата сообщения: 22.03.2011 17:47
Компилирую Tasm-ом... Turbo Link Version 7.1.30.1.
Команда Tasm прошла успешно, obj-файл появился...
Tlink проходит с ошибкой "Fatal: 32-bit record encountered in module 1.asm" появляется только map-файл
Автор: akaGM
Дата сообщения: 22.03.2011 18:11
praidik
переопредели numb1 и numb2 как dw

и используй

mov ax, word ptr numb1
Автор: praidik
Дата сообщения: 22.03.2011 18:18
Всем спасибо!
Получился такой код...

Model small
stack 256
dataseg
numb1 dw 3
numb2 dw 2
codeseg
start:
mov ax, @data
mov ds,ax
mov ax, word ptr numb1
mov bx, word ptr numb2
add ax, bx
aaa
xchg al,ah
add ah, '0'
int 29h
mov al,ah
int 29h
Mov ah, 1h
Int 21h
mov ah, 04ch
int 21h
end start

Всё работает.
Автор: xzGORzx
Дата сообщения: 25.03.2011 10:18
Здравствуйте.
Вот такая проблема: нужна запускать программу написанную на FASM с параметром.
Например запускаем из консоли нашу программу с параметром -blablabla и она переходит к нужной метке.
Подскажите, возможно такое реализовать?
Автор: Molniev
Дата сообщения: 29.03.2011 19:33
Если ты пишешь под Windows, то используй WinAPI:

GetCommandLine Function
Retrieves the command-line string for the current process.

Код: LPTSTR WINAPI GetCommandLine(void);
Автор: blaro
Дата сообщения: 11.04.2011 15:23
День добрый.
Мне нужно написать программу которая посылает данные на принтер (для печати) через порт LPT. Уже перепробывал много но так и не получилось. Скажите, куда копать? Где искать инфу?
Автор: Molniev
Дата сообщения: 11.04.2011 20:32
Буду не слишком оригинален - повторю то что в учебниках по ассемблеру пишут на первых страницах (хороших учебниках): "...В Ассемблере отсутствуют собственные средства ввода-вывода данных, используя ассемблер вы должны использовать средства самой операционной системы или на прямую взаимодействовать с оборудванием..."

Если программа, которую вы пишете, предназначена для Windows, используйте её API функции:
CreateFile
WriteFile
CloseHandle

Принцип работы: через call вызываете CreateFileA, передавая в качестве имени файла "LPT1", остальные параметры - как указано в статье по первой ссылке, где описываеться взаимодействие с COM портами. В eax будет хенд для работы с портом. Этот хенд, указатель на текст для печати, его размер и указатель на dw переменую, куда сохраниться число записаных байт, передаёте WriteFile. Можно вызвать неоднократно. После закрыть хенд CloseHandle.

Если то что я ниписал непонятно - настоятельно рекомендую найти книгу "Assembler: Практикум" Юрова (она есть в Интернете) и ознакомиться с работой с файлами из ассемблера. Работа с принтерами по COM или LTP осуществляеться так же - только данные пишуться не в файл, а "в принтер" и при открытии, вместо имени файла указываеться имя порта и другии параметры соответственно разделу в CreateFile посвященному работе с COM.
Автор: blaro
Дата сообщения: 11.04.2011 21:14
Работать с файлами мне приходилось, но мало.
Это прога действительно для Windows. Я еще не знаю на каком языке я буду писать основную программу (C# или Java). Я думаю написать dll и включить его в прогу.
Одно НО! Это не простой принтер, это принтеры Zebra. Эти принтеры в основном печатают наклейки. Или это не имеет значения, какой принтер?
Зы: За книгу спасибо
Автор: akaGM
Дата сообщения: 11.04.2011 23:50
blaro

Цитата:
Мне нужно написать программу которая посылает данные на принтер (для печати) через порт LPT.

на асме есть три низкоуровневых пути:

1) прямая адресация lpt-портов 378h-37fh
2) использовать функцию bios 17h
3) использовать dos функцию 5h

ищи по этим ключевым моментам...
Автор: blaro
Дата сообщения: 12.04.2011 18:52
akaGM
Сегодня на работе перепробывал все 3 варианта. Не один не сработал. Единственное что, удалось получить немного данных. При работе с прерыванием 17h в АН получаю 90h в одном случае и 98h в другом, это когда в DX определяешь номер порта. И еще удалось выяснить что это EPP.
Автор: akaGM
Дата сообщения: 12.04.2011 19:07
blaro
так быстро, может код покажешь?
и под какой осью?
Автор: Molniev
Дата сообщения: 12.04.2011 20:16
akaGM вы конечно извините, но это пути для DOS приложений. В режиме совместимости Windows сэмулирует два последних варианта. Для первого нужно вообще - либо чистую MS DOS либо собственную операционную систему))
blaro же пишет приложение для Windows - слой эмуляции не работает и не один из предложэеных вариантов работать тоже не должен. Почему:
1. Доступ к портам ввода-вывода имеют только драйвера
2. Доступ к bios возможен только из реального режима работы процессора. Windows работает в защищенном - к bios обратиться невозможно без драйвера и "хард ресета" для Windows
3. DOS эмуляция есть только для DOS приложений, dll таким не являеться по определению

Поэтому:
1. blaro единственный путь - использование Windows API.
2. Самый простой путь, если надо выводить только текст - использовать что я отписал. Открыть порт как файл и писать в него текст как в файл.
3. Чесно скажу - не пробовал. Нету у меня lpt принтера))) Но способ это старый и формально должен работать с любым принтером.
4. В WinAPI есть куча других функций для печати (ну печатают же ворд с блокнотом как-то)) - но насчет их подсказать уже не могу - не использовал. Ну кроме того, что через GDI по идее можно получить дескриптор принтера и "отрисовывать" через BitBlt на нем то что надо печатать.
Автор: akaGM
Дата сообщения: 12.04.2011 20:26
Molniev
да, конечно, это варианты для ДОСа...
просил для асма -- получил решение конкретно под него...
и вообще не понятно зачем ему ассемблер, если предполагаются языки высокого уровня, которые и без него хорошо уживаются с виндовским АПИ...
так уж критично по времени исполнения?
Автор: Molniev
Дата сообщения: 12.04.2011 20:40
Ну, я б не сказал, что варианты для дос это "просил для асма -- получил решение конкретно для него..." но посмеялся)))
Я тоже понятия не имею зачем нужна dll-ка на асемблере для Java или C# для печати. Когда отписывался первый раз не знал. Но извращени это конечно очень сильное и начисто лишонное какого либо смысла. Просто человек спросил конкретную вещь.

PS. Почему извращение сильное: в C# есть нативно штатные средства для печати и никокой ниобходимости в сторонних dll-ках нет в принципе. Хоть Zebra хоть ещё что. Если могут распечатать на нем что либо другие приложения (те самые блокнто и ворд), то и ваша C#-пная программа сможет. Но dll-ка ограничет платформу для работы приложения + лишний код.
Почему начисто лишонное смысла: потому что связка C# + Asm DLL будет работать Медленней чем просто C#. Тоже и для Java. Зато лишний код, ограничения платформы, сложности с передачей параметров и в перспективе, как следствие - глюки.

PPS. Работа с принтером из ассемблера в любом случае сведёться к вызовам WinAPI. А любые эти вызовы можно сделать и из C# и из Java, без лишних библиотек.
Автор: blaro
Дата сообщения: 12.04.2011 22:11
akaGM

Цитата:
и вообще не понятно зачем ему ассемблер, если предполагаются языки высокого уровня, которые и без него хорошо уживаются с виндовским АПИ...

Molniev

Цитата:
Я тоже понятия не имею зачем нужна dll-ка на асемблере для Java или C# для печати

Я может перемудрил с dll, и оно здесь ни к чему. Я просто хочу написать прогу на асме которая просто печатает текст на принтере. Просто для себя.
Автор: akaGM
Дата сообщения: 12.04.2011 22:17
blaro
похвальное решение... серьёзно... только зачем, с целью изучения ассемблера?

тогда то что предлагаю тебе я, пойдёт лишь под чистой ДОС и под старенькими 95-98 виндами...
Автор: blaro
Дата сообщения: 12.04.2011 22:25
akaGM

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

Да, с целью изучения ассемблера.
Автор: akaGM
Дата сообщения: 12.04.2011 22:28
blaro
вот возьми, надеюсь поможет, хоть и на c++:
http://www.internals.com/utilities/WinIo.zip

Цитата:
WinIo
Version 3.0 supports 64 bit platforms and concurrent use from multiple applications. WinIo allows direct I/O port and physical memory access under Windows NT/2000/XP/2003/Vista/7 and 2008.


всегда можно компильнуть с опцией /Fa :)
Автор: Molniev
Дата сообщения: 13.04.2011 20:13
Тогда решение в корне не верное. Если хочеш изучать ассемблер - попробуйте найти в сети учебник практикум к которому я советовал: В.И. Юров "Assembler", 2-е издание. ISBN 5-94723-581-1. Учебник достаточно адекватен, хотя и потребует сначала прочесть пару глав теории.

Изучать ассемблер надо во первых с теории - что такое процессор и как он работает с точки зрения машинных комманд, а во вторых на вычислительных задачах. Пытайтесь создать на ассемблере реализации криптографических алгоритмов или алгоритмов сжатия данных или кодирования/декодирования к примеру изображений. Процетирую самого себя:
Цитата:
Буду не слишком оригинален - повторю то что в учебниках по ассемблеру пишут на первых страницах (хороших учебниках): "...В Ассемблере отсутствуют собственные средства ввода-вывода данных, используя ассемблер вы должны использовать средства самой операционной системы или на прямую взаимодействовать с оборудванием..."

На ассемблере реализуються вычислительные алгоритмы. Печать и любой другой ввод-вывод завязаны на API/ABI операционной системы и практически идентично для многих языков.
Нет никакого смысла для изучения ассемблера писать программу на нём для печати, потому что на C, C++, Pascal, Basic и длинной веринице других языков и на ассемблере будет иметь не значительные отличия и опыта не принисёт.
Повторяюсь: хотите изучить - начните с теории. Хотите опыта - пишите программы на вычислительные задачи.

Автор: blaro
Дата сообщения: 13.04.2011 20:44
Molniev
Я учился на программиста, и даже диплом есть. И теорию знаю и практика небольшая есть. Нас учили писать простые программы, а работать с "железом" нас не учили. А за книгу еще раз спасибо. Я ее нашел и читаю уже.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

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


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