Другие языки программирования и технологии
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
Вам надо записать адрес вашей перменнной в эти регшистры, и тогда 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
Тут и так по существу! не забывайте про циклические команды! REP REPZ REPNZ
STOSB записывает в ячейку! можно сделать аналогично:
MOV ES:[SI],AL
просто stosb будет быстрее в этом отношении.
Ее используют в связке LDOSB (аналог MOV AL,DS:[DI])
STOSB записывает в ячейку! можно сделать аналогично:
MOV ES:[SI],AL
просто stosb будет быстрее в этом отношении.
Ее используют в связке LDOSB (аналог MOV AL,DS:[DI])
Похожие вопросы
- Сложное уравнение (ax+b)/(cx+d)=0 на Pascal
- Расскажите про язык assambler
- Какую функцию выполняют команды real и integer (var a,b,c:integer;) на Pascal ABC Net? И чем они отличаются?
- помогите составить таблицы истиности -А -> (B + C); (A B) * C; -A + -B + C; - (A + B) * C ; A * B _+ C; A B
- Уравнение a*x+b*y=c
- {(a,b), (c,b), (c,a)} - является транзитивным или нет?
- Помогите испрвить код Переписать первые элементы каждой строки матрицы a(n*m), больше некоторого числа C, в массив b .
- Напишите программу для С++, которая заменяет в символьной строке все буквы a на буквы b, буквы A на буквы B ...
- Как осуществить операцию сложения в с++ без операции присваивания ? int a=5; int b=6; int c=a+b; ( без "= ")
- Почему пишет : "Нельзя преобразовать тип function(a:real,b:real) real к real "