Другие языки программирования и технологии

assambler - команда stos'b

вобщем если правильно понял то команда работает со строками. stosb-->читает значение из AL в память, адрес который указан в паре es:(e)di вот сдесь начиеться проблемма у меня. (0042:f7a8) не могу понять как воспользоваться этой инструкцей. Т.е что значит прочитать в память я понимаю если есть переменная то на языках высокого уровня это типо А = 150, К примеру. Или я так предположил что я могу написать адрес и туда записать но на каком основании адрес писать, придумать если то нелогично?
Команда STOSB записывает байт, находящийся в регистре AL, по адресу, находящемся в сегменте данных, который задается регистрами ES:DI.

Вам надо записать адрес вашей перменнной в эти регшистры, и тогда STOSB скопирует байт из регистра AL в эту область. После выполнения команды регистр DI увеличивается на единицу, то есть указывает смещение следующего байта.

Например, если у вас есть последовательность байтов, заданная

memory db 10 DUP( 0 )

а регистр DS указывает адрес сегмента, в которой расположено объявление memory.

ТОгда вы должны в ES завписать значение DS, а в DI смещение memory относительно сегмента ES или DS (nfr rfr jyb, elen e dfc hfdys).

Можно это сделать следующим образом:

mov di,offset memory
push ds
pop es
mov al,'A"
stosb

То есть сначала вы записываете в DI смещение memory относительно начала сегмента, адресуемого регистром DS. Затем кладете ES равным DS. Напрямую с помощью команды mov es,ds этого делать нельзя, поэтому вы используете команды работы со стеком.

Не забудьте установить флаг направления, чтобы после команды STOSB регистр DI увеличивался на единицу, а не уменьшался. Делается это командой CLD перед STOSB

cld
stosb
ПК
Павел Калашник
79 586
Лучший ответ
Тут и так по существу! не забывайте про циклические команды! REP REPZ REPNZ
STOSB записывает в ячейку! можно сделать аналогично:
MOV ES:[SI],AL
просто stosb будет быстрее в этом отношении.
Ее используют в связке LDOSB (аналог MOV AL,DS:[DI])