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

» Assembler

Автор: akaGM
Дата сообщения: 28.04.2010 19:17
Cheery12
открой этот топик как версию для печати (ссылка "Версия для печати" вверху) и поищи по уже написанному (типа mov ah, 9h или int 21h), этот вопрос (вывод чисел на консоль) здесь обсуждался раза два как минимум...

---
стоп!
а это кто тебе писал?

Код: mov ah, 9
mov dx, offset Str_a
int 21h
Автор: aspis
Дата сообщения: 28.04.2010 19:48

Цитата:
div cl; (a+b)/2a

В al частное, в ah остаток будут в HEX виде, который необходимо перевести в строковый вид наверное.
[more=Для примера перевод строки в число и обратно]
Код:
model small
.stack 100h
.data
    adr1 db '235$'
    adr2 dw ?
    adr3 dw 3
    adr4 dw 1
.code
push ax
mov ax, @data
mov ds, ax

    mov cx,10
    lea si,adr1-1
    mov bx, adr3
a10:
    mov al,[si+bx]
    and ax,000fh
    mul adr4
    add adr2,ax
    mov ax,adr4
    mul cx
    mov adr4,ax
    dec bx
jnz a10    

    mov cx,10
    lea si,adr1+2
    mov ax, adr2
b10:
    cmp ax, 0010
    jb b20
    xor dx,dx
    div cx
    or dl, 30h
    mov [si], dl
    dec si
    jmp b10
b20:
    or al, 30h
    mov [si], al

    mov ah, 9
    mov dx, offset adr1
    int 21h
    mov ax, 10h
    int 16h
    mov ah, 4ch
    int 21h
end
Автор: blaro
Дата сообщения: 29.04.2010 11:14
akaGM
Что то я плохо понял. Вот как бы ты такой код написалбы на асме?

Код:
for(i=0;i<N;i++)
{
printf(prod[i].name\t prod[i].cost\t prod[i].quantity);
printf("\n");
}
Автор: akaGM
Дата сообщения: 29.04.2010 12:39
blaro
ну это не совсем и на Сях, а так...
ты умеешь строку выводить?


Код: crlf db 0ah, 0dh, '$'
Str_a db 'prod[i].name', 09h, 'prod[i].cost', 09h, 'prod[i].quantity', '$'

mov ah, 9
mov dx, offset Str_a
int 21h
mov ah, 9
mov dx, offset crlf
int 21h
Автор: blaro
Дата сообщения: 29.04.2010 12:43
akaGM
Так умею. Вот теперь все понятно. Спасибо!
Автор: akaGM
Дата сообщения: 29.04.2010 12:47
blaro
для сведения...

Код: mov dx, offset Str_a
Автор: bomzzz
Дата сообщения: 29.04.2010 13:04
и в чем разница. код различается или в количестве тактов економия???
Автор: akaGM
Дата сообщения: 29.04.2010 13:27
bomzzz
для flat-модели памяти разницы нет, а для
Цитата:
P.S. пишу на асме 8086

есть, из-за сегментации...
пролог программы для этого случая в теории всегда выглядит как-то так:
Код:
mov ax, ds
push ax ; или mov es, ax
pop es
...
Автор: Abs62
Дата сообщения: 29.04.2010 17:17
akaGM

Цитата:
иначе пришлось бы _всегда_ писать
lea dx, ds:var_name
что не все асеемблеры допускают,

А какие-то допускают? Вроде как смещение в любом случае считается по сегменту, в котором переменная прописана. Какой смысл указывать сегментный регистр?

Цитата:
mov dx, offset var_name
вообще-то опять не во всех ассемблерах однозначно говорит, где расположена var_name
и отчего "её смещать"...

Почему оно неоднозначно?
Автор: akaGM
Дата сообщения: 29.04.2010 17:37
Abs62
точно помню, что низзя и только для com и flat ззя
не буду вспоминать, что придираешься?
пусть делает как хочет...

---
вроде вспомнил: так ни в коем случае нельзя делать для локальных переменных

и вообще lea быстрее!
Автор: Abs62
Дата сообщения: 29.04.2010 18:40
akaGM
lea функциональнее, с её помощью можно даже вычисления проводить. Типа lea eax,[ebx*4+edx]
Автор: akaGM
Дата сообщения: 29.04.2010 19:36
Abs62
тебя всё на 32+ бита тянет, а чел, небось, на турбо16 сидит...

[more=вот пример геморра с offset в старых версиях масма]
Пример поможет нам пояснить, как легко можно нажить неприят-
ности из-за специфики адресации в MASM. Рассмотрим следующую не-
полную программу MASM, в которой описываются три сегмента данных:

dseg1 SEGMENT para public 'data'

v1 db 0
dseg1 ENDS

dseg2 SEGMENT para public 'data'
v2 db 0
dseg2 ENDS

dseg3 SEGMENT para public 'data'
v3 db 0
dseg3 ENDS

DGROUP GROUP dseg1,dseg2,dseg3
cseg SEGMENT para public 'code'

ASSUME cs:cseg,ds:DGROUP

start:
mov ax,OFFSET v1
mov bx,OFFSET v2
mov cx,OFFSET v3
cseg ENDS
END start

Три сегмента dseg1, dseg2 и dseg3 группируются под одним
именем DGROUP. В результате все переменные отдельных сегментов
хранятся в памяти вместе. В исходном тексте программы в каждом из
отдельных сегментов описывается байтовая переменная (метки v1, v2
и v3).

В коде данной программы MASM в регистры AX, BX и CX загружа-
ются смещения адресов этих переменных. В соответствии с предшест-
вующей директивой ASSUME и из-за того, что сегменты данных сгруп-
пированы вместе, вы можете подумать, что MASM будет вычислять
смещения переменных относительно всей группы, в которой перемен-
ные очевидно хранятся в памяти.

Но произойдет совсем не это! Вопреки вашим намерениям MASM
вычисляет смещения переменных относительно отдельных сегментов
dseg1, dseg2 и dseg3. Он делает это несмотря на то, что все три
сегмента данных сгруппированы в памяти в один сегмент данных, ад-
ресуемый через регистр DS. Бессмысленно определять смещения пере-
менных относительно отдельных сегментов в тексте программы, ког-
да эти сегменты скомбинированы в памяти в один сегмент.
Единственный способ ссылки на такие переменные состоит в ссылке
на их смещения относительно всей группы.

Чтобы избавиться в MASM от этой проблемы, вам потребуется
наряду с ключевым словом OFFSET задавать имя группы:

mov ax,OFFSET DGROUP:v1
mov bx,OFFSET DGROUP:v2
mov cx,OFFSET DGROUP:v3


[/more]
Автор: Abs62
Дата сообщения: 29.04.2010 19:49
akaGM

Цитата:
тебя всё на 32+ бита тянет, а чел, небось, на турбо16 сидит...

Так оно и в 16 разрядах работает аналогично - побочный эффект допустимости индексной арифметики.
Автор: akaGM
Дата сообщения: 29.04.2010 20:46
Abs62
работает, работает, сейчас будешь объяснять чтО такое ebx
хорошо ещё, что не вслух...
кстати, а ты как этот регистр называешь?

mov eax, offset array[ebx*4+edx]
mov eax, offset [ebx*4+edx]

тоже ничего...
Автор: KuPbI4
Дата сообщения: 29.04.2010 20:49
Решено.
Автор: Abs62
Дата сообщения: 29.04.2010 21:32
akaGM

Цитата:
кстати, а ты как этот регистр называешь?

Какой? ebx? ebx.

Цитата:
mov eax, offset array[ebx*4+edx]
mov eax, offset [ebx*4+edx]

тоже ничего...

Вот именно, что ничего.

Цитата:
                 mov eax,offset[ebx*4+edx]
2.asm(6) : error A2098: invalid operand for OFFSET
00000000 8D 04 9A         lea eax,[ebx*4+edx]

Автор: akaGM
Дата сообщения: 30.04.2010 12:12
Abs62

Код: .386
.model flat, stdcall
.data
array dd 100 dup(?)
.code
start:
xor eax, eax
mov eax, offset array[ebx*4+edx]
mov eax, offset [ebx*4+edx]
ret
end start
Автор: Abs62
Дата сообщения: 30.04.2010 13:06
akaGM

Цитата:
Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International

Я так и думал.
Там, где masm честно говорит "нельзя", tasm просто игнорирует "offset". С естественно плачевным результатом.

Цитата:
10 00000008 8B 04 9A mov eax, offset [ebx*4+edx]
11 0000000B 8B 04 9A mov eax, [ebx*4+edx]

Как говорится, найдите десять различий.

Цитата:
а произносишь?

Как пишется.
Автор: akaGM
Дата сообщения: 30.04.2010 14:00
Abs62
вот именно отсюда, в частности, моё:

Цитата:
что не все асеемблеры допускают

кстати, мои слова о необходимости писать сегментный префикс совсем из другой оперы
это я спутал с дефолтной привязкой косвенной адресации к "своим" регистрам
bp, bx, si, di к ss, ds, es
типа ds:[di + 4]


Цитата:
Как пишется.

в какой транскрипции?
Автор: Abs62
Дата сообщения: 30.04.2010 14:17
akaGM

Цитата:
вот именно отсюда, в частности, моё:
Цитата:что не все асеемблеры допускают

Ну, конструкцию mov eax, offset [ebx*4+edx] вряд ли какой ассемблер поймёт.

Цитата:
в какой транскрипции?

В английской, вестимо. Разве появились уже ассемблеры, именующие регистры по-русски?
Автор: akaGM
Дата сообщения: 30.04.2010 15:02
Abs62
а что, синтаксис верный? -- да...

Цитата:
В английской, вестимо

блин...
"ибиэкс", "ибиикс" или "ебиикс"
скучный ты...
Автор: Abs62
Дата сообщения: 30.04.2010 15:39
akaGM

Цитата:
а что, синтаксис верный? -- да...

Не. Offset - это же не команда процессора как lea, это инструкция компилятора, он должен знать ответ на этапе компиляции. Откуда ж ему в этот момент знать содержание регистров?

Цитата:
"ибиэкс", "ибиикс" или "ебиикс"

"Ебэикс". Акцент, панимаишь.

Цитата:
скучный ты...

Я в курсе.
Автор: akaGM
Дата сообщения: 30.04.2010 16:02
Abs62

Цитата:
это инструкция компилятора

в мануалах оператором называют...
короче, я-то как раз за lea призывал...

Цитата:
Акцент, панимаишь

"Эбэикс"
:)
Автор: blaro
Дата сообщения: 07.05.2010 20:52
Скажите пожалуста, как можно поменять местами значения в регистрах AL и AH не прибегая к использованию вспомогательных переменных или других регистров?
Один вариант я нашел

Код:
XCHG AH,AL
Автор: bomzzz
Дата сообщения: 07.05.2010 20:54
через логические операторы попробуй, если это единственный оператор обмена

Добавлено:
ну то есть я имею ввиду нечто эдакое. содержимое AH преобразуем логическим оператором содержимым AL, потом выполняем некую обратную логическую операцию с AL используя содержимое AH так чтоб в результате в AL оказалось изначальное содержание AH, ну и потом так же добиваемся чтоб в AH оказалось AL. не могу ниче сходу сообразить вышку сто лет назад сдавал.
Автор: Abs62
Дата сообщения: 07.05.2010 21:45
blaro
Например, ror ax,8. Или rol ax,8.
Автор: bomzzz
Дата сообщения: 07.05.2010 21:49
так попроще

гыгы 4 способа, три простых - препод лажанулся
Автор: karakurt2
Дата сообщения: 07.05.2010 22:39
blaro
Ваш преподаватеь, наверное, имел в виду всем известныйприём для обмена содержимого регистров.
Автор: bomzzz
Дата сообщения: 07.05.2010 22:44
программист должен точнее формулировать свои мысли.
Автор: Rooftop
Дата сообщения: 10.05.2010 21:54
Уважаемые форумчане
Простите что обращаюсь к вам... сами мы немесные....)))))))

Вобщем нужна небольшая помощь. Кто шарит Assembler, помогите если невлом. Очень нужно написать елементарную програмулину на Assembler.

Она должна уметь:

1. Создать файл

2. Сделать запись в файл

3. Считать из файла

вот пример похожей проги которая умеет лишь создать файл (вирусов там нету))

благодарю за внимание. очень надеюсь на вашу помощь. чем быстрее тем лучше
ато завтра нужно уже сдать)

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

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


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