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

» Assembler

Автор: akaGM
Дата сообщения: 27.04.2012 20:42
mov ax, 123

вот это какой код?
Автор: bomzzz
Дата сообщения: 27.04.2012 20:47
он будет одинаково выполняться

Добавлено:
http://www.opennet.ru/docs/RUS/nasm/nasm_ru9.html
Глава 9: Смешивание 16- и 32-битного кода.
Автор: akaGM
Дата сообщения: 27.04.2012 20:59

Код:
jmp 0x1234:0x56789ABC ; ошибка!
jmp dword 0x1234:0x56789ABC ; правильно
Автор: bomzzz
Дата сообщения: 27.04.2012 21:08
я вообще про 64 ни че не говорю. я говорю о 16 и 32.
как внутри кода изменить разрядность, как использовать директиву use правильно
Автор: A1exSun
Дата сообщения: 28.04.2012 17:13
Скачал tasm32. Пытаюсь собрать код, написанный в 16, получаю:

E:\Downloads\tasm5plus\BIN>tlink32 cpuid
Turbo Link Version 1.6.71.0 Copyright (c) 1993,1996 Borland International
Fatal: 16 bit segments not supported in module cpuid.ASM

Можно как-то исправить?
Автор: bomzzz
Дата сообщения: 28.04.2012 17:22
добавь директиву USE16 наверно, а может .386 попробуй по крайней мере
Автор: Yvaliko
Дата сообщения: 28.04.2012 19:00

Цитата:
tlink32

Еще бы он не ругнулся.
Автор: bomzzz
Дата сообщения: 28.04.2012 19:04
гы точно. должен быть отдельный линкатор для 16 бит
Автор: Yvaliko
Дата сообщения: 28.04.2012 19:09
Просто надо вместо TASM32.EXE и TLINK32.EXE использлвать TASM.EXE и TLINK.EXE.
Все что оканчивается на 32 используется на программирование под винды и не умеет компилировать dos приложения.
Автор: A1exSun
Дата сообщения: 28.04.2012 19:21
Yvaliko

Цитата:
Просто надо вместо TASM32.EXE и TLINK32.EXE использлвать TASM.EXE и TLINK.EXE.

Угу. Их и использую в виртуальной машине.
Автор: A1exSun
Дата сообщения: 29.04.2012 18:12
Как сдвигом битов поделать BL на 2? shr bl, 2 не срабатывает почему-то...
Автор: Abs62
Дата сообщения: 29.04.2012 18:22
A1exSun
Сдвигать надо не на само значение, а на степень двойки. То бишь shr bl,1.
Автор: A1exSun
Дата сообщения: 29.04.2012 18:37
Угу. В другом месте была проблема, BX портился

Рисую интерфейс дольше чем писал половину программы...

Добавлено:
Очищаю так экран и устанавливаю атрибуты для текста - белый фон и синие символы:

Код: mov ah, 7 ; свертка текстового окна вниз
mov al, 0
mov bh, 0F1h ; атрибут для выводимого текста
xor cx, cx
mov dh, [es:484h]
mov dl, [es:44Ah]
dec dl
int 10h
Автор: akaGM
Дата сообщения: 02.05.2012 14:31
A1exSun
а ты лучше блинк включи, так круче...
:)
Автор: xliker
Дата сообщения: 12.05.2012 16:36
Доброго всем дня. Мучает вот какой вопрос: при использовании любой директивы для работы со строками (catstr, instr и др. ) в разрабатываемой программе вылетает ошибка Missing text macro. Насколько я понял из гугла, ошибка появляется при недостатке аргументов, но у меня, на мой взгляд, их хватает. Вот пример строк, где вылетает:

Код:
...
buffer3 CATSTR buffer2,buffer1
...
lenbuf2 sizestr buffer2
...
;вот сегмент данных
masm
model small

.data
handle1 dw 0
handle2 dw 0
filename1 db 'f.txt',0
filename2 db 'g.txt',0
point_fname1 dd filename1
point_fname2 dd filename2
string db 50 dup(' ')
buffer1 db 10 dup(' ')
buffer2 db 10 dup(' ')
buffer3 db 10 dup(' ')
entr db 13
s db 'test'
lenstr dw 0
lenbuf2 dw 0
Автор: akaGM
Дата сообщения: 12.05.2012 17:46
ну сегмент данных, да...
а как catsrt зовёшь?
Автор: Abs62
Дата сообщения: 12.05.2012 17:47
xliker

Цитата:
Насколько я понял из гугла, ошибка появляется при недостатке аргументов, но у меня, на мой взгляд, их хватает.

Хватает, да не тех.

Цитата:
Each text item can be a literal string, a constant preceded by a %, or the string returned by a macro function.

buffer2 и buffer1 - не строки, не константы и не макро. Вот и выдаются ошибки.
Автор: akaGM
Дата сообщения: 12.05.2012 18:06
xliker
ну да...
могу предложить:

buffer1 equ ' '
buffer2 equ ' '
buffer3 CATSTR buffer2,buffer1


или не выделываться и "слушать свои валенки"

buffer3 db 20 dup(0)

Автор: xliker
Дата сообщения: 13.05.2012 21:40
akaGM

Цитата:
buffer1 equ ' '
buffer2 equ ' '
buffer3 CATSTR buffer2,buffer1

Простите за тупые вопросы, просто в ассемблере далеко не силён.
Вот так работает, но как определять строки не как константы через equ? Ведь buffer1 и buffer2 у меня не константные, они заполняются в процессе выполнения программы, конкретно - чтения из файла...
Автор: Yvaliko
Дата сообщения: 13.05.2012 22:08
xliker
Как по мне, так макросы в асме это на любителя. Повторяющийся код проще запихнуть в процедуру и вызывать ее через call. Тут открывается простор для творчества. Как ты передашь в процедуру переменные решаешь ты сам и никто другой. При отладке опять же самописный код намного понятнее выглядит, чем какие то макросы.
Автор: Abs62
Дата сообщения: 13.05.2012 22:38
xliker
Директивы компилятора выполняются в процессе компиляции программы. Поэтому они могут работать только с теми константами, которые известны на этот момент. Пытаться с их помощью сделать что-то с данными, которые становятся известны только в процессе работы программы, бессмысленно.
Автор: akaGM
Дата сообщения: 13.05.2012 23:40
xliker

чем тебя такой вариант не устраивает?

buffer3 db 20 dup(0)
Автор: MERCURY127
Дата сообщения: 14.05.2012 10:06
А меня вот бесит, когда вместо макро делают процедуру в две строчки и вызывают ее! На эти две строчки приходится две-три строчки подготовки регистров, сам вызов, стек и возврат! Вот нафига? На проход процедуры в 5 байт затрачивается еще минимум столько же байт плюс штраф за стек! Плюс дикая неудобочитаемость кода! А ведь макросы в масме помощнее препроцессора Си! Куда смотрят преподы?!!
Автор: akaGM
Дата сообщения: 14.05.2012 13:34

Цитата:
Куда смотрят преподы?!!
как куда, сисадмины порнуху разрешили немного потянуть...

CallFar MACRO CAddr
CALL DWORD PTR CAddr
ENDM

:)
Автор: Yvaliko
Дата сообщения: 14.05.2012 22:15
MERCURY127
Как я уже сказал, они на любителя. К макросам тоже бывает нужно подготавливать регистры. Из несомненных плюсов только экономия на стеке.

Цитата:
Куда смотрят преподы?!!
Да ктож их знает. Я сам асм учил, без всяких преподов.
Автор: bomzzz
Дата сообщения: 14.05.2012 22:17
да где ассемблер учат. только на матфаках да информатике в вузах. остальные начинают изучать ассемблер после языков высокого уровня и тащут туда привычки
Автор: MERCURY127
Дата сообщения: 15.05.2012 19:32
Yvaliko

Код:
dos_print macro Text
lea dx, Text
mov ah, 9
int 21h
endm

.model large

.data
CRLF db 13, 10, '$'
welcome db "Welcome to Assembler!$"

.code
.startup

dos_print welcome
dos_print CRLF
Автор: akaGM
Дата сообщения: 16.05.2012 09:54
макросы не на любителя, а для использования в качестве... макросов
как и функции для функций...

не помню кем, может Кнутом, а может и Дейкстрой, доказано, что для осуществления любого алгоритма в языке достаточно ровно 3-х операторов (присваивание, if и goto), однако ж сколько контрол-операторов в современных языках?
нужно пользоваться всеми выразительными средствами языка для эффективности получаемого кода
Автор: Yvaliko
Дата сообщения: 16.05.2012 14:36
MERCURY127
Можно сделать проще.

Код: CRLF db 13, 10, '$'
welcome db "Welcome to Assembler!$"
Автор: MERCURY127
Дата сообщения: 16.05.2012 14:58
Yvaliko, а не подумалось, что крлф потом еще пять раз отдельно пишется, для перевода строки? Оптимизация, ага ...

Добавлено:
А бут сектор со сканером клавиатуры у меня тоже был, и где то еще валяется

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

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


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