LINUX.ORG.RU

asm 16bit + dos + es:ds


0

0

Подскажите что такое регистры типы es:ds и как ими пользоваться. 
Например нужно в графическом режиме в DOS поменять форму курсора мыши.

И сказано:
In: AX = 9h
    BX = column number
    CX = row number
    ES:DX = XOR/AND array address

И что значит это последнее? В ES находится адрес расширенного сегмента 
данных (или что-то вроде того ;), а что в ES:DX?

И как туда вписать этот адрес?

Делаю так (TASM 5.0 DOS):

=== Cut ===
.model small
.stack
.data
	curs_mask	dw 0ffffH
			dw 0ffffh
			dw 0ffffh
			dw 0ffffh
			dw 0000h
			dw 0ff0h
			dw 0ff0h
			dw 0000h
.code
main:
	mov ax, @data
	mov ds, ax

	; 1. init graphic mode
	mov ax, 13h
	int 10h

	; show cursor
	mov ax, 1h
	int 33h

	; change cursor to smth else
	mov ax, 9h
	mov bx, 1 ; column number
	mov cx, 1 ; row number
	mov es:dx curs_mask
	int 33h

        ....
end main
=== Cut ===

И в этой линии все плохо (too few operands to instruction..)

mov es:dx curs_mask

Как этими es:dx и адресами пользоваться?




>mov ax, @data mov ds, ax

Ну вот в твоем же примере используется сегментный регистр. в него занесли адрес сегмента .data. А для функции 9h прерывания 33h (ты не ошибся?) тебе надо занести этот же адрес в es, а смещение curs_mask в регистр dx. То есть:

mov ax, 9h

mov bx, 1 ; column number

mov cx, 1 ; row number

mov dx, @data

mov es, dx

mov dx, offset curs_mask

int 33h

Там еще была команда lea для таких случаев, ну это уже сам ;)

vit122
()
Ответ на: комментарий от vit122

Спасибо. Т.е. то что в описании написано "es:dx" значит "адрес сегмента в es, offset в dx"? А что означает вообще ':'? Вроде бы я видел такие вещи где-то.

Курсор правда форму так и не поменял. ;)

mov ax, 9h
mov bx, 10 ; column number
mov cx, 10 ; row number

mov dx, @data
mov es, dx
mov dx, offset curs_mask

int 33h

Правда курсор уже не видно после этой манипуляции, так что что-то происходит, но с другой стороны не видно вообще никакого курсора. ;)

dissident ★★
() автор топика
Ответ на: комментарий от dissident

Вообще в наше время формат dos exe со своей многосегментностью нафиг не упал. Для образовательных целей достаточно делать com, в нем всегда один сегмент, и все сегментные регистры указывают на него (во всех windows- и linux-приложениях примерно так же ;)), так что можно не заморачиваться с ними (c сегментами).

А вообще, тебе нужен не гугль, а:

http://www.lib.ru/CTOTOR/IBMPC/abel.txt

ну и:

http://www.cs.cmu.edu/~ralf/files.html

Там есть ответы на все твои вопросы ;)

vit122
()
Ответ на: комментарий от vit122

>Ну вот в твоем же примере используется сегментный регистр. в него >занесли адрес сегмента .data. А для функции 9h прерывания 33h (ты не >ошибся?) тебе надо занести этот же адрес в es, а смещение curs_mask в >регистр dx. То есть:

>mov ax, 9h
>mov bx, 1 ; column number
>mov cx, 1 ; row number
>mov dx, @data
>mov es, dx
>mov dx, offset curs_mask
>int 33h

Если для образовательных целей - то это пример того как ненадо писать на ассемблере
>>mov ax, @data mov ds, ax
добавь к этому:
mov ax, @data
mov ds, ax
mov es, ax

Модель памяти small предполагает один сегмент данных и инициализацию сегментных регистров надо делать в начале программы.

anonymous
()

>.stack

Чтобы программы вообще когда-нибуть заработали то оставляй для стека хоть немнога памяти :)

.stack 100h

anonymous
()
Ответ на: комментарий от vit122

програмный сегмент TLS в ELF ABI определяет инициализационный образ TLS данных, посредством которого формируется TLS блок для модуля

реализация статической модели TLS для x86 использует регистр GS для определения линейного адреса TCB и TLS блоков
GDT каждого CPU в системе содержит набор из 3-х TLS дескрипторов с селекторами, отличными от __USER_DS, каждый из которых может кэшироваться в GS при вызове set_thread_area()
при этом база GS имеет ненулевое значение, а лимит может быть не равен 4G

rei3er
()

У нас гость из машины времени или ваш ВУЗ заклинило на программе 15-ти летней давности? O_o

(хмм, у меня страшные подозрения про текущий курс асма на родном иу7)

sv75 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.