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

» Assembler

Автор: akaGM
Дата сообщения: 30.03.2012 10:09

Цитата:
ВНУТРИ MZ ЗАГОЛОВКА! Один вопрос: КАК???
что-то я тут пропустил...

а это не стабом делается?
Автор: MERCURY127
Дата сообщения: 30.03.2012 10:23
Нет, это мс туда приспособились текстовые строки писать без необходимости рекомпиляции всего файла при переводе на другой язык.
Автор: A1exSun
Дата сообщения: 30.03.2012 12:21
1.

Код: data segment
char db "123QWErty"
scan db 2, 3, 4, 5, 6, 7, 8, 9, 0ah, 0bh
data ends

code segment
...
mov cx, 9
xor si, si
next_key:
; имитация нажатий клавиш
mov ah, 5
push cx
mov cl, [char+si]
mov ch, [scan+si]
int 16h
pop cx
inc si
loop next_key
Автор: akaGM
Дата сообщения: 30.03.2012 14:17
A1exSun
(1)
странно, у тебя скан-коды вообще с символами не совпадают, начиная с 'Q'
123QWErty
2 3 4 16 17 18 19 20 21
вроде так вот должно быть...

и ты бы al после int16 проверял
Автор: A1exSun
Дата сообщения: 30.03.2012 16:48
akaGM

Цитата:
у тебя скан-коды вообще с символами не совпадают

Да, то просто раньше там было 1-9, не исправил. Можно вообще их не писать, а ставить 0, это ничего не меняет.

Цитата:
ты бы al после int16 проверял

Окай, попробую.
Автор: akaGM
Дата сообщения: 30.03.2012 17:05
A1exSun

а ты читаешь их по 16h/00?
обычно лучше задержку ввести по 16h/01, появилось в буфере -- прочитать
+
попробуй ещё:
Код:
push si
int 16h
pop si
Автор: A1exSun
Дата сообщения: 30.03.2012 17:40
akaGM

Цитата:
а ты читаешь их по 16h/00?

Точно! В конце программы строки для того чтоб не сразу закрывалась:

Код: mov ah, 0h
int 16h
Автор: bomzzz
Дата сообщения: 30.03.2012 18:07
никто не может хотя бы пару слов сказать как программы портировать. хоть че гуглить или чем это делается
Автор: cp58
Дата сообщения: 31.03.2012 09:40
bomzzz
Что? Откуда? Куда?

Переносить можно код с одной операционной системы на другую.(Win->Linux)
Портировать также можно ассемблерный код с других платформ(x86 -> SPARC -> ARM).
Переносить можно код движка для разных DE сред(Qt, GNOME).
И т.д.

Чаще всего с самого начала используют переносимые библиотеки, например стандартная библиотека C.
Автор: bomzzz
Дата сообщения: 31.03.2012 09:42
библиотека сзначит нужна специальная.

портировать вообще надо виндовс программы использующие апи для того чтоб они работали на голом яздре до загрузки оболочки со всеми апи
Автор: cp58
Дата сообщения: 31.03.2012 10:09
bomzzz

Цитата:
библиотека сзначит нужна специальная.

Сомневаюсь.

Часть API от win32 перенесется легко, например CreateFile, с более высокоуровневыми могут быть проблемы.
Больше всего хлопот будет с динамической памятью.
Автор: MERCURY127
Дата сообщения: 31.03.2012 12:57
bomzzz, на голом ядре чего? NT Kernel? Linux/BSD Kernel? На каком именно уровне ядра нужно работать? Драйвер или Native NT Application? Покажи уж хоть что именно и куда нужно портировать... а то Телепаты в отпуске
Автор: bomzzz
Дата сообщения: 31.03.2012 13:06
да мне сам принцип интересн, хоть куда

Добавлено:
должна значица быть какая то комнада компилятору которая позволить все вызовы других библиотек импортировать в саму программу или в дллку специальную типа такого

Добавлено:
я даже не знал как писать то правельна пАртировать или пОртировать, от слова part или port
Автор: MERCURY127
Дата сообщения: 31.03.2012 13:28

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

пример для мс компилеров: cl /MT ... file1.c file2.c ... /link /map lib1.lib lib2.lib ...
только врядли тебе это поможет потому что портировать означает вручную переписать/заменить/дописать свои внешние зависимости от исходной платформы на аналоги в целевой. А этот ключ тупо вклеивает все внешние модули в библиотеках в ехе. Т.о. зависимости от msvcrt.dll и пр уйдут, но Win32 зависимости от kernel32.dll и иже с ними никуда не денутся. Хочешь запустить это на лине или на нативной машине НТ - убирай зависимости от kernal32.dll и пр РУЧКАМИ! Т.е. ВРУЧНУЮ ищи или пиши замены всему этому добру: http://i.imgur.com/ak0hg.png

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

include <stdio.h>
main( int arg){
printf( "\nArgument: %d\n", arg);
}// main

это на любой системе с любым си компилером соберется и будет работать но достаточно заменить Argument на Аргумент - и уже весьма вероятны проблемы

Добавлено:
и кстати раз уж тема Ассемблер - то знай: портировать прогу на Асме гораздо сложнее, чем на Си - потому как привязка к деталям рабочей платформы обычно намного сильнее, т.к. нет изолирующей прослойки в виде C Run Time routines ...
Автор: A1exSun
Дата сообщения: 01.04.2012 18:35
Есть программа на ассемблере, выводит много информации на экран и соответственно вся она не помещается, нужно строк 100.
Хочу сделать скроллинг - нажимаешь стрелку вниз, текущая инфа уходит вверх, внизу появляется новая, и наоборот.
Как такое реализовать, если сейчас все выводится с помощью 2 и 9 функции INT 21h?

Пока есть два варианта:
1. Выводить всю инфу в файл, потом уже читать из него - короче дописать просмотрщик текстовых файлов со скроллингом. Мешает файл.
2. Разбить всю инфу на страницы и сделать по ним навигацию - предыдущая, следующая. Не так красиво, как просто скроллинг.

Добавлено:
В чем разница между "mov ax, @data" и "mov ax, data"?
Автор: akaGM
Дата сообщения: 01.04.2012 18:49
A1exSun
ты ж что-то подобное делал на паскале...

1) если это для того чтобы "сдать", то причём тут красота?
2) если "не п.1)", тогда, конечно, надо делать страничную организацию, может только не по дата-буферу, а по видео-странице (помнишь параметр видео "адрес _начала_ видеобуфера?)

Добавлено:

Цитата:
В чем разница между "mov ax, @data" и "mov ax, data"?
в конечном результате ничем...
@data - макро-символ, кот поддерживают не все компиляторы, а "data" -- это ты так сам обзываешь сегмент, можно было хоть dseg, _data, главное описать и assume'ать
Автор: A1exSun
Дата сообщения: 01.04.2012 19:02
akaGM

Цитата:
ты ж что-то подобное делал на паскале...

На Си читал из файла все в буфер и потом выводил


Цитата:
1) если это для того чтобы "сдать", то причём тут красота?

Раз делать, то круто

Цитата:
надо делать страничную организацию, может только не по дата-буферу, а по видео-странице (помнишь параметр видео "адрес _начала_ видеобуфера?)

Не совсем понял что ты имеешь ввиду. 0B800h начало видеобуфера.
Для 2 и 9 функций не указывается номер страницы куда выводить.
Но так тоже можно, вывести все на отдельные страницы, при этом они не будут полностью заполнены, так как я не знаю точно сколько будет информации, потом сделать их переключение клавишами.
Но это не так здорово, как полноценный скроллинг по одной строке.
Автор: akaGM
Дата сообщения: 01.04.2012 19:07

Цитата:
Но это не так здорово, как полноценный скроллинг по одной строке.

по одной строке -- это изменение начала вывода видео-буфера на 160 байт (при 80х25)
Автор: A1exSun
Дата сообщения: 01.04.2012 19:08

Цитата:
а "data" -- это ты так сам обзываешь сегмент, можно было хоть dseg, _data, главное описать и assume'ать

А если у меня сегменты .STACK, .DATA, .CODE - их assume'ть не требуется же?


Цитата:
по одной строке -- это изменение начала вывода видео-буфера на 160 байт (при 80х25)

Не пойму как так можно. Допустим у меня выводится 50 строк текста на экран, первые 25 пропадают же? Откуда я их потом выведу.
Я ищу простейшее решение, чтоб не переписывать весь вывод инфы, которая динамическая.

Кстати, если тебя не затруднит, объясни мне в двух словах этот код:

Код: entry struc
mask dd ?
msg db 16 dup(?) ; 16 characters max including $ terminator
entry ends

table LABEL BYTE
entry <00000001h, "111$"> ; [0]
entry <00000002h, "222$"> ; [1]
entry <00000008h, "333"> ; [3]
table_count = ($ - offset table) / (size entry)
Автор: akaGM
Дата сообщения: 01.04.2012 19:23
ну пиши по 4кб байт 8 раз direct memory-способом, а потом переключайся...


Цитата:
А если у меня сегменты .STACK, .DATA, .CODE - их assume'ть не требуется же?

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


Цитата:
А второй, он как массив
ну да, типа массив 20-байтовых структур, которые инициализированы 1 2 8 и 111 222...
всё ты правильно понимаешь...
Автор: A1exSun
Дата сообщения: 01.04.2012 19:38
akaGM

Цитата:
ну пиши по 4кб байт 8 раз direct memory-способом, а потом переключайся...

Не понял Я не хочу переписывать вывод, там в 100 местах придется менять ah 2h и 9h int 21h на другое.

Цитата:
да мало ли ассемблеры наупрощали, использовал бы классическую схему -- проблем не было бы...
кстати, а в чём проблема-то?

Проблемы нет, только интерес.

Цитата:
типа массив 20-байтовых структур

LABEL - это же метка?
Автор: akaGM
Дата сообщения: 01.04.2012 19:58
A1exSun

Цитата:
Проблемы нет, только интерес

изначально на ассемблере х86 принято писать так:
Код: DATA SEGMENT BYTE PUBLIC ; тут ещё можно имя, например 'DATA'
...
DATA ENDS

STACK SEGMENT BYTE PUBLIC
...
STACK ENDS


CODE SEGMENT BYTE PUBLIC
ASSUME CS:CODE, DS:DATA, SS:STACK
...
CODE ENDS
Автор: A1exSun
Дата сообщения: 01.04.2012 20:20
akaGM

Цитата:
DATA SEGMENT BYTE PUBLIC

Что здесь значит BYTE?

Цитата:
да... и что тебя смущает?

Да хочу в подробностях понимать как оно работает.

Так что насчет скроллинга? Как сделать, чтоб не пришлось переписывать весь вывод?
Автор: MERCURY127
Дата сообщения: 01.04.2012 20:33
BYTE это выравнивание сегмента - бывает по byte, word, dword, qword, para, page
Автор: A1exSun
Дата сообщения: 01.04.2012 20:49
MERCURY127
Ок, а чего здесь тогда выравнивание?

Цитата:
table LABEL BYTE

Метки?
Автор: akaGM
Дата сообщения: 01.04.2012 20:49
A1exSun

Цитата:
Так что насчет скроллинга? Как сделать, чтоб не пришлось переписывать весь вывод
на ассемблере я пас...



Цитата:
Ок, а чего здесь тогда выравнивание?

блин...
а выравнивание по "наименьшему адресуемому размеру" на х86 -- байт

table LABEL BYTE
entry <00000001h, "111$"> ; [0]
...

lea si, table -- получение стартового адреса таблицы


вот тебе задание

table LABEL BYTE
entry <00000001h, "111$"> ; [0]
entry <00000002h, "222$"> ; [1]
entry <00000008h, "333"> ; [3]
table_count = ($ - offset table) / (size entry)

перепиши это без
table LABEL BYTE
и исполни аналог
lea si, table
Автор: akaGM
Дата сообщения: 01.04.2012 21:01
table db 1, db 3 dup(0), db "111$" ; [0]
entry <00000002h, "222$"> ; [1]
entry <00000008h, "333"> ; [3]
table_count = ($ - offset table) / (size entry)

так намного удобнее, правда?

ты бы книжечку по основам асм зачёл какую-нибудь...
Автор: A1exSun
Дата сообщения: 01.04.2012 21:06
akaGM

Цитата:
блин...
да ни-че-го

Понял, убрал - ничего не сломалось.


Цитата:
table db 3 dup(0), 1, db "111$"> ; [0]

Что-то здесь явно не то.


Цитата:
ты бы книжечку по основам асм зачёл какую-нибудь...

Да ладно, мне осталось 2 лабы и курсак
Автор: akaGM
Дата сообщения: 01.04.2012 21:08
table db 1,0,0,0, "111$"


Цитата:
Да ладно, мне осталось 2 лабы и курсак

а хрен ли тогда интересно?

на самом деле я не совсем прав...

выравнивание там в смысле "наименьшего адресуемого куска"
адрес таблицы = адрес её самого _первого_ байта, а не ворда или дворда...

при table label dword может что-то и сломаться если непосредственно писать по конкретным адресам...

тогда всегда надо будет писать
byte ptr table
например

просто у тебя умолчальное выравнивание в сегменте стоит byte

table label == table label byte
Автор: A1exSun
Дата сообщения: 01.04.2012 21:41
akaGM

Цитата:
просто у тебя умолчальное выравнивание в сегменте стоит byte

table label == table label byte

Этому я уже тоже догадался. Это если:

Код: DATA SEGMENT BYTE PUBLIC

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

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


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