Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2016, 17:48   #1
Sterben
Форумчанин
 
Аватар для Sterben
 
Регистрация: 01.03.2015
Сообщений: 118
По умолчанию Сегментные регистры и адрессация

Здравствуйте, объясните какая роль у Selector(сегментные регистры),кроме того что DS:для данных, CS:кода и SS:стек, что конкретно можно с ними делать, желательно пример если можно.MASM. Спасибо.
Изображения
Тип файла: png Addr.png (11.5 Кб, 119 просмотров)

Последний раз редактировалось Sterben; 27.06.2016 в 17:51.
Sterben вне форума Ответить с цитированием
Старый 27.06.2016, 20:58   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Sterben Посмотреть сообщение
что конкретно можно с ними делать
..да мало-ли чего? Нужно понять, что регистры CS/DS/ES/SS юзаются только под досом, т.е. только в сегментной модели памяти. Под вынью они лишены смысла, т.к. в плоской модели памяти винды нет сегментов, а есть только одни смещения. Адресация у них такая:

- для доса: 0000:0000h (segffset) FFFF0h = 1.048.560 байт = 1 Mb
- для винд: 0x00000000h (offset) FFFFFFFFh = 4.294.967.295 байт = 4 Gb

Под досом, они предназначены для адресации к различным сегментам памяти. Допустим, нам нужно считать/записать какие-нить данные с "чужого" сегмента, например считать вектор с таблицы прерываний, или записать данные напрямую в видеобуфер. Таблица прерываний лежит по адресу 0000:0000h, видео/буфер в текст.режиме начинается с B800:0000h, а дос загрузил тело нашей программы по адресу:
Код:
C:\>debug
-r
AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=13A2  ES=13A2  SS=13A2  CS=13A2  IP=0100   NV UP EI PL NZ NA PO NC
13A2:0100 0000          ADD     [BX+SI],AL                         DS:0000=CD
-d
13A2:0100  00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
13A2:0110  00 00 00 00 00 00 00 00 - 00 00 00 00 34 00 91 13   ............4...
13A2:0120  00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
13A2:0130  00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
13A2:0140  00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
13A2:0150  00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
13A2:0160  00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
13A2:0170  00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
-
..как видим, 13A2:0100h. Теперь, чтоб прыгнуть в чужой сегмент мы должны адресовать его как-раз через эти/сегментые регистры CS/DS/ES. В отладчике достаточно дать команду(D) с нужным адресом:
Код:
-d b800:0
B800:0000  4D 07 69 07 63 07 72 07 - 6F 07 73 07 6F 07 66 07   M.i.c.r.o.s.o.f.
B800:0010  74 07 20 07 57 07 69 07 - 6E 07 64 07 6F 07 77 07   t. .W.i.n.d.o.w.
B800:0020  73 07 20 07 58 07 50 07 - 20 07 5B 07 82 07 A5 07   s. .X.P. .[.....
B800:0030  E0 07 E1 07 A8 07 EF 07 - 20 07 35 07 2E 07 31 07   ........ .5...1.
B800:0040  2E 07 32 07 36 07 30 07 - 30 07 5D 07 20 07 20 07   ..2.6.0.0.]. . .
B800:0050  20 07 20 07 20 07 20 07 - 20 07 20 07 20 07 20 07    . . . . . . . .
B800:0060  20 07 20 07 20 07 20 07 - 20 07 20 07 20 07 20 07    . . . . . . . .
B800:0070  20 07 20 07 20 07 20 07 - 20 07 20 07 20 07 20 07    . . . . . . . .
-
..а в коде программы только через эти регистры.
Ещё один пример можно привести с использованием их в строковых командах. Имена сегментных регистров жёстко привязаны к некоторым операциям, типа LODSB/STOSB:

- LODSB читает байт в регистр AL, из ячейки памяти DS:SI
- STOSB пишет значение байта AL, в ячейку памяти ES:DI

На практике, чтоб загнать текстовую строку расположенную в сегменте данных нашей программы в тот-же сегмент видеобуфера будет выглядеть так.. (к слову, он организован как в дампе выше: символ(4D) + его атрибут(07), что даёт возможность выводить цветные строки):
Код:
;fasm code...
format MZ
org 100h
jmp start

mess   db   'Hello World!'     ;
len    =    $ - mess           ; длина строки

start: mov   ax,3              ; ставим видео 80х25/16
       int   10h               ;
       push  es 0b800h         ;
       pop   es                ; ES:DI указывает на сегмент видео
       mov   di,(160*12)+70    ; позиция в окне: строка(12), столбец(35)

       mov   si,mess           ; DS:SI указывает на адрес строки
       mov   cx,len            ;
       mov   ah,0Ah            ; цвет символа (атрибут)
print: lodsb                   ; читаем байт из DS:SI
       stosw                   ; пишем слово в ES:DI
       loop  print             ; мотаем СХ-раз..
       
       pop   es                ; возвращаемся в свой сегмент
       xor   ax,ax             ; ждём клаву..
       int   16h               ;
       mov   ax,4c00h          ; на выход!
       int   21h               ;
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 28.06.2016, 09:46   #3
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Привет, R71MT!
Цитата:
Имена сегментных регистров жёстко привязаны к некоторым операциям, типа LODSB/STOSB:
Там где адресация идет через регистр EDI (STOS/SCANS/CMPS) там да, есть привязка к сегментному регистру ES, а вот кроме регистра DS можно использовать также и CS/ES/SS/FS/GS, только писать нужно так
Код:
lods byte ptr cs:[esi]; al=cs:[esi] esi=esi+1
movsd es:[edi],es:[esi]; es:[edi]=es:[esi] edi=edi+4 esi=esi+4
Mikl___ вне форума Ответить с цитированием
Старый 28.06.2016, 11:18   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Mikl___, спасибо!
Честно сказать - не знал. Всегда применял, как и описывают в манах..
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Адрессация paralon Помощь студентам 1 10.06.2014 08:16
сегментные регистры Dimarik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 05.09.2011 13:29
pascal сегментные часы world12_tk Помощь студентам 9 03.06.2009 22:20
Регистры Elm0 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 13 10.02.2008 19:49