Консультация № 175092
10.12.2009, 01:31
0.00 руб.
0 6 1
Здравствуйте уважаемые эксперты! Нужна Ваша помощь.

1. Объясните пожалуйста назначение команд lds и cwd (с примерами если можно). Спасибо большое.
2. Помогите пожалуйста, нужно написать программку, которая решает данный пример: VAR1=P2/VAR1+P1*P3 (у меня проблемы с делением). Транслятор TASM.
Если можно с комментариями. Спасибо Вам.

Обсуждение

Неизвестный
10.12.2009, 08:28
общий
1. cwd обычно используется при делении, когда делимое нужно расширить c 16 до 32 бит
Код:

mov ax,-10
mov bx,-5
cwd ; dx:ax=ax
idiv bx

2. lds загружает регист сегмента ds и приемник (смещение) из переменной из памяти, удобен при работе с дальними указателями
Код:

.model large
.386
.fardata
a dw 2
.data
b dw 1
adr_a dw a,@fardata ; указатель на переменную в другом сегменте, смещение:сегмент
.code
start:
mov ax,@data
mov ds,ax
lea si,b
mov ax,[si] ; ax=@data:[si]=1
lds di,dword ptr adr_a; ds=@fardata
mov ax,[di] ; ax=@fardata:[di]=2
mov ax,[si] ; ax=@fardata:[si]!=1
mov ax,4c00h
int 21h
end start
давно
Посетитель
7438
7205
10.12.2009, 12:14
общий
Airyashov:
Почему бы не оформить ответом?
Заодно и на второй вопросик ответьте...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
10.12.2009, 20:26
общий
Лысков Игорь Витальевич:
Да, посчитал, что на второй как-то не очень объяснить получается, поэтому в форум написал.
Неизвестный
10.12.2009, 21:17
общий
Airyashov:
Спасибо Вам
давно
Посетитель
7438
7205
11.12.2009, 01:02
общий
это ответ
Здравствуйте, Николай // Programmator .
Ответ на второй вопрос в приложении. Рассматриваем данные, как целые слова (WORD).
Программа имеет ограничения:
1) VAR1 должно быть отлично от 0
2) P1*P3 и P2/VAR1+P1*P3 должны быть < 32767

Приложение:
;VAR1=P2/VAR1+P1*P3
.model small
.data
VAR1 dw 30
P1 dw 20
P2 dw 400
P3 dw 50

.code
.startup
mov ax,P2 ;Загрузим делимое P2
cwd ;в DX:AX
idiv VAR1 ;Делим DX:AX на VAR1
mov VAR1,ax ;Сохраним частное (остаток в DX отбрасываем)

mov ax,P1 ;Загрузим первый множитель
imul P3 ;Умножим на второй DX:AX = P1 * P3
add VAR1,ax ;Добавим до первого результата (старшее слово игнорируем)

.exit 0
end
5
Спасибо Вам огромное, уже разобрался и решаю другие примеры)))
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
12.12.2009, 01:57
общий
Всем огромное спасибо за помощь
Форма ответа