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

» Assembler

Автор: akaGM
Дата сообщения: 22.03.2012 23:22
A1exSun
а можно на код до "search:" глянуть?

+

mov str1[bx], 'x'
mov str1[bx], 'x'

почему два раза?

+

насколько я помню,
"repe" само по СХ работает, а ты его на loop ещё зарядил
т.е. я бы префикс repe убрал...
Автор: Abs62
Дата сообщения: 22.03.2012 23:32
A1exSun

Цитата:
Почему CX становиться меньше нуля и выходит бесконечный цикл?

Потому, надо полагать, что loop сначала декрементирует CX, и только потом проверяет на 0. С loop тщательнЕе надо.
Автор: akaGM
Дата сообщения: 22.03.2012 23:41
A1exSun
я понял твою логику и, наверное, неправ...
твой CX -- общая длина строки, и счётчик сквозной, так? тогда лучше вставить "выпрыг" по jcxz внуть цикла...
Автор: A1exSun
Дата сообщения: 22.03.2012 23:42
akaGM

Цитата:
mov str1[bx], 'x'
mov str1[bx], 'x'

Второй раз - str2.

Цитата:
"repe" само по СХ работает, а ты его на loop ещё зарядил

У меня repe как бы внутренний цикл поиска неравных элементов... Нашел - заменяю их и дальше в цикл
Abs62
Перед loop сделать проверку CX?

Добавлено:
akaGM

Цитата:
тогда лучше вставить "выпрыг" по jcxz внуть цикла

Сделал, работает.
Только вот почему строки не правит?.. (x не пишет)
Автор: akaGM
Дата сообщения: 22.03.2012 23:53
A1exSun

Цитата:
а можно на код до "search:" глянуть?

:)
Автор: A1exSun
Дата сообщения: 23.03.2012 00:04
akaGM
А да, пожалуйста

Код: xor ch, ch
mov bh, str1+1
mov bl, str2+1

cmp bh, bl
ja strlen2
mov cl, str1+1
jmp strlen1
strlen2:
mov cl, str2+1
strlen1:

lds si, str1+2
les di, str2+2
xor bx, bx
cld

search:
repe cmpsb
je not_edit
mov str1+bx, '+' ; наугад пробую
mov str2+bx, '-' ; всевозможные комбинации =)
not_edit:
inc bx
jcxz str_end
loop search
str_end:
Автор: akaGM
Дата сообщения: 23.03.2012 00:16
я бы всё-таки весь рег почистил
xor cx, cx

а так вроде Abs62 говорил, что это
mov str1+bx, '+'
относительно стека вычисляется...

может так?
mov byte ptr ds:str1[bx], '+'
mov byte ptr es:str2[bx], '-'
Автор: A1exSun
Дата сообщения: 23.03.2012 00:19
akaGM

Цитата:
я бы всё-таки весь рег почистил
xor cx, cx

Так там потом в CL значение точно заноситься


Цитата:
может так?

Не работает. Еще варианты?

Добавлено:
Что-то я намутил вообще... После repe cmpsb нужно ZF=1 проверять, JE или? Почему проверка срабатывает даже когда байты равны? Вроде он другую область памяти проверяет, а не мои строки...
Автор: akaGM
Дата сообщения: 23.03.2012 00:36
mov byte ptr ds:str1[bx+si], '+'
mov byte ptr es:str2[bx+di], '-'

:)

ch не нужен, а все лупы по целому сх работают...
xor ch, ch -->
xor cx, cx
Автор: Abs62
Дата сообщения: 23.03.2012 00:37
akaGM

Цитата:
а так вроде Abs62 говорил, что это
mov str1+bx, '+'
относительно стека вычисляется...

Относительно стека по умолчанию вычисляется bp, а не bx.

A1exSun
Ну, навскидку сразу видно, что сравнение начинается с str+2, а замена с str+0.
А так смотри под отладчиком, что и где там у тебя меняется.


Цитата:
Что-то я намутил вообще... После repe cmpsb нужно ZF=1 проверять, JE или?

Выход из "repe cmpsb" произойдёт либо по CX=0, либо по ZF=0.
Автор: A1exSun
Дата сообщения: 23.03.2012 00:41
akaGM

Цитата:
ch не нужен, а все лупы по целому сх работают...
xor ch, ch -->
xor cx, cx

Дык я очищаю CH, а CL заношу свое значение. CX = CH + CL

Abs62

Цитата:
Ну, навскидку сразу видно, что сравнение начинается с str+2, а замена с str+0.

Это уже заметил... mov bx, 2 не помогло. Не понятно.

Добавлено:
Все исправил. Всем спасибо!
Автор: akaGM
Дата сообщения: 23.03.2012 00:53
A1exSun

Цитата:
Дык я очищаю CH, а CL заношу свое значение
ну да, стормозил...


Цитата:
Все исправил.
показывай...
Автор: A1exSun
Дата сообщения: 23.03.2012 00:57
akaGM
Все оказалось проще:

Код: search:
cmpsb
je equal
mov str1[bx], '+'
mov str2[bx], '-'
equal:
inc bx
loop search
strend:
Автор: blaro
Дата сообщения: 23.03.2012 14:20
День добрый всем. Моя программа не разворачивает строку до конца. Если вводим "Hello everyone" то получаем "enoyreve olle". Последний символ где-то теряется. Помогите найти проблему.
Вот код

Код:
.MODEL SMALL
.STACK 100h
.DATA
mystr db'Hello everyone','$'
revstr db ($-mystr) dup(?)
len dw $-mystr ;length of mystr
.CODE
    assume ds:@DATA,ss:@STACK
start:
    mov ax,@DATA
    mov ds,ax
    mov si,len
    lea di,revstr
    mov cx,len
lp1:    mov al,mystr[si]
    mov [di],al
    inc di
    dec si
    loop lp1
    mov ax,4c00h
    int 21h
END start
Автор: akaGM
Дата сообщения: 23.03.2012 15:39
blaro
в длине строки есть последний доллар и обращаться она начинает с него
может просто добавить к len единичку?
Автор: blaro
Дата сообщения: 23.03.2012 15:50
akaGM

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

Не, не поможет
Автор: Abs62
Дата сообщения: 23.03.2012 16:00
blaro
Проблема номер раз:

Цитата:
len dw $-mystr ;length of mystr

В этом самом len окажется суммарная длина mystr и revstr. Не пойдёт. Надо так:

Код: len dw revstr-mystr ;length of mystr
Автор: MERCURY127
Дата сообщения: 25.03.2012 20:05
Исправлено
Путем использования экстендера HX DOS by Japheth (http://www.japheth.de), удалось заставить работать MASM 7.10 из комплекта Visual Studio 2003, ML.EXE 7.10.3077 под pure DOS (!), работу выполняет на 5+. Немного не такие дефолты (COFF vs OMF), как в старых версиях. Но в целом вполне рабочий файл для DOS/Win3x/Win9x/NTx32/NTx64 (!). Если кому надо - брать тут (только необходимые файлы, остальное берем в общеизвестных местах - PWB, MSC7, SDK, DDK, masm32 и пр). Пароль стандартный.
Автор: MERCURY127
Дата сообщения: 27.03.2012 14:45
А теперь вопрос, интересующий меня уже много лет, и по которому гугль откровеннно партизанит! . Как известно, компиляторы обычно помещают .DATA в конец ЕХЕ файла. Например, при компиляции примера из предыдущего поста имеем: http://i.imgur.com/1nyqR.png. Классический ЕХЕ, ничего особенного... Теперь берем ЕХЕ из комплекта МС-ДОС 7.х, например, XCOPY.EXE: http://i.imgur.com/YQGnD.png
Ахалай-Махалай! Текстовые строки, например "Ошибка интерпретации параметров" - ВНУТРИ MZ ЗАГОЛОВКА! Один вопрос: КАК???
PS: /EXEPACK не помогает...
Автор: bomzzz
Дата сообщения: 27.03.2012 15:11


а вот так. смотри No APM 1.2

Добавлено:
а блин у тебя 32 битное щаз

Добавлено:
блин не могу в один экран поместить.

Добавлено:
ты можешь вообще м блоки данных сам организовать как хочешь, сам выровнять по границе, выделить сегмент, и не пользоваться услугами компилятора
Автор: MERCURY127
Дата сообщения: 27.03.2012 15:24
bomzzz, ком я и сам умею! мне мз интересен!
Цитата:
Текстовые строки, например "Ошибка интерпретации параметров" - ВНУТРИ MZ ЗАГОЛОВКА! Один вопрос: КАК???
Автор: bomzzz
Дата сообщения: 27.03.2012 15:33
помещеют же туда электронную подпись. правда я сам всегда делал это редактором. может есть команда для компилятора, а может надо патченный компилятор. как раньше было что компилятор вписывал номер машины в заголовок файла, чтоб вирусопейсателей ловить
Автор: MERCURY127
Дата сообщения: 27.03.2012 15:47
подпись все же немного не туда помещают - она ПОСЛЕ мз заголовка, и даже после кода - а это именно внутри, конкретно - внутри таблицы релокаций... можно спокойно выдрать эти строки, перевести их на другой язык, причем даже с изменением длин, и снова склеить файл - при этом не нужно будет рекомпилить прогу заново. Те это спец сделано для удобства локализации! там даже пометки есть - RUS, ENG... Мне интересно узнать, КАК именно это было сделано... Какой то дополнительный тулз - или все же достаточно самого компилера...
Автор: cp58
Дата сообщения: 28.03.2012 09:55
MERCURY127
Что мешает указать компановщику смещение для секции?
Можно также написать самому MZ заголовок на ассемблере, а компановщику "приказать" не вставлять MZ заголовок.
Автор: bomzzz
Дата сообщения: 28.03.2012 10:00
cp58
приказать волшебными пассами или заряженной водой?
Автор: cp58
Дата сообщения: 28.03.2012 10:16
bomzzz
Я обычно использую параметры передаваемые программам, у каждого свои способы.
Автор: MERCURY127
Дата сообщения: 28.03.2012 14:50
Разобрался чуть чуть в тех мз это не какой то особый линкер и не спец ключи. Это просто динамическая подгрузка локализации. Обычным кодом, находящимся в том же месте, где и остальной код этих ехе. И находится он не в релокациях, и отношения к собст мз заголовку не имеет а то я уж подумал, может мс изобрела нечто вроде ресурсов для мз ...

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

Добавлено:
Короче это нечто вроде оверлея
Автор: MERCURY127
Дата сообщения: 29.03.2012 17:50
"Как же я, как же я сильно хочу... Как же я, как же я очень хочу... "
... собрать DOSIDLE ... где бы добыть эти инклуды:

include "_stddata.ah"
include "_tsrres.ah"
include "_dcon.ah"
include "_tsrinit.ah"
include "_cmdline.ah"
include "_console.ah"
include "_process.ah"
include "_test.ah"
include "_irq.ah"
include "_vcpi.ah"
include "_cpu.ah"

понятно, что они Written by Marton Balog... быть может, тут обитает кто нибудь более изощрённый в поисках в сети???
Автор: cp58
Дата сообщения: 29.03.2012 21:10
MERCURY127
Давно собирал через nasm одну из реализаций, она действительно небольшая, непонятно зачем столько подключается дополнительных средств. Если надо выложу бинарник, так как исходники как обычно куда-то исчезли.

google -> "filetype:asm dosidle" выдает тучу вариантов.
Автор: MERCURY127
Дата сообщения: 30.03.2012 08:38
Бинар у меня уже есть. И есть глюки. Вот хочу попробовать починить но для начала надо хоть понять, в чем у него отличие резидентдата от просто дата сегмент блаблабла. Потом тоже для кода...

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

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


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