Консультация № 195683
21.05.2019, 16:42
0.00 руб.
21.05.2019, 18:52
0 45 1
Здравствуйте! Прошу помощи в следующем вопросе:

[b]Исходные данные a,b,c,d – указываются произвольно. Вычислить


Получился такой код:

Код:

org 100h
mov al,[a] ; al=a
mov cl,[c] ; cl=c
mov bl,10 ; bl=10
add al,bl ; al=al+bl
div cl ; al=ax/cl
mov [f],al
loop 0102h

;---------------
a db 1
c db 1
f db ?


В компиляторе ошибок нет, хотелось бы уточнить, что правильно/неправильно.

Обсуждение

давно
Посетитель
403037
55
21.05.2019, 18:36
общий
Цитата: Зенченко Константин Николаевич
Верхнего ограничения нет, а это путь в никуда.


т.е. мой пример не имеет смысла?
давно
Посетитель
7438
7205
21.05.2019, 18:40
общий
21.05.2019, 18:40
Адресаты:
В Вашей методичке я вижу две ошибки и одну некорректность.
1) То, что написано 0 [$8804$] b [$8805$] 10 не означает, что написано правильно. Вы понимаете суть этой записи? b больше 0 и b больше 10. Это как?
Где тут изменение b от 0 до 10?
2) Предложенная реализация цикла отработает не от 10 до 0, а от 10 до 1, т.к. при cx = 0 loop не отправит на продолжение цикла
Некорректность в том, что писать абсолютные адреса в командах перехода, цикла как-то нехорошо., это допустимо только в листингах.
Вы же смотрите на листинг и тоже пишете число-адрес. Надо использовать метки, а не абсолютные числа.

К методичкам надо относиться критически...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
403037
55
21.05.2019, 18:42
общий
Цитата: Лысков Игорь Витальевич
Вы понимаете суть этой записи? b больше 0 и b больше 10. Это как?


Вот я тоже не понял этот момент

Цитата: Лысков Игорь Витальевич
К методичкам надо относиться критически...


Поэтому к вам и пришел с этими вопросами
давно
Старший Модератор
31795
6196
21.05.2019, 18:46
общий
Цитата: lordwarrior161
т.е. мой пример не имеет смысла?

Скорее всего в методичке "очяпятка".
Это Ваша методичка
Цитата: lordwarrior161
0102 mov cx,10;cx=c=10, помещаем в регистр cx конечное значение диапазона переменной с=10

Цитата: lordwarrior161
0109 loop 0104 ;Если сх>0 то переход на указанный адрес.

Смотрите у СХ есть, кончное значение, которое стремится к нулю.
Правильно?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
21.05.2019, 18:49
общий
Адресаты:
И еще, пример из методички показывает, что переменные a, c - слова, а не байты.
Поэтому и в своей программе подправьте.
В данной программке лучше отказаться от loop
Лучше сделать так:[code lang=asm]mov cx, 10
m:
;...
dec cx
jge m ;если cx>=0, то идем на m
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
21.05.2019, 18:53
общий
Адресаты:
Ну-с, готовы написать правильный код?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
403037
55
21.05.2019, 18:57
общий
Цитата: Лысков Игорь Витальевич
И еще, пример из методички показывает, что переменные a, c - слова, а не байты.


тогда может в предыдущих моих консультациях я зря переменные брал в квадратные скобки [] , ибо нигде в примерах у меня их не было

Цитата: Лысков Игорь Витальевич
Ну-с, готовы написать правильный код?


готов сейчас буду пробовать
давно
Посетитель
7438
7205
21.05.2019, 19:02
общий
тогда может в предыдущих моих консультациях я зря переменные брал в квадратные скобки [] , ибо нигде в примерах у меня их не было
Это зависит от используемого компилятора. В FASM-е брать в скобки надо!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
403037
55
21.05.2019, 19:17
общий
Цитата: lordwarrior161
готов сейчас буду пробовать


Похоже, что не готов, при компиляции все время сыпятся ошибки, не понимаю, какие регистры надо брать
давно
Посетитель
7438
7205
21.05.2019, 19:19
общий
Адресаты:
Показуй
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
403037
55
21.05.2019, 19:24
общий
21.05.2019, 19:26
Цитата: Лысков Игорь Витальевич
Показуй


ну допустим
Код:


org 100h
mov al,a ;al=a
mov bl,c ;bl=c
mov cx,10 ;cx=b=10


далее мне надо сложить a+b, т.е. al+cx (это как я понимаю) но на этом моменте компилятор вываливается с ошибкой. Все таки совсем я эту тему не понял

Ох уж этот ассемблер. Учу параллельно Swift от Apple, там такого безобразия нету понимаю, что язык высокого уровня, но все же
давно
Посетитель
7438
7205
21.05.2019, 19:26
общий
Адресаты:
А как насчет моей рекомендации?
И еще, пример из методички показывает, что переменные a, c - слова, а не байты. Поэтому и в своей программе подправьте.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
21.05.2019, 19:28
общий
Адресаты:
Ну или остаться на байтах, тогда надо складывать не с cx, а с cl (это младший байт слова cx)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
21.05.2019, 19:30
общий
Адресаты:
[code lang=asm] mov ax,a
mov ax,[a] [/code]
Компилятор делает,эти строки по разному:
1)адрес переменной а;
2)значение переменной а.
Вы можите сами это проверить.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
21.05.2019, 19:32
общий
Адресаты:
Так все, я отключаюсь от нашей милой беседы...
Оставляю Вас на попечение К.Н.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
403037
55
21.05.2019, 19:40
общий
Адресаты:
вот как я понял

Код:
org 100h

mov al,[a] ; al=a
mov bl,[c] ; bl=c
mov cl,10 ; cl=b=10
add al,cl ; al=al+cl
div bl ; al=ax/bl
loop 0103h
mov [f],al


;--------------------
a db 1
c db 1
f db ?
давно
Старший Модератор
31795
6196
21.05.2019, 19:40
общий
Адресаты:
Цитата: lordwarrior161
Ох уж этот ассемблер. Учу параллельно Swift от Apple, там такого безобразия нету

Ну Вы сравнили, Swift это ЯВУ, и большую часть,там компилятор думает за кодера. Ассемблер - это язык CPU и тут кодер ДОЛЖЕН думать за CPU.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
21.05.2019, 19:53
общий
Адресаты:
Вот вариант проще, по пробуйте его скомпилировать и пройти по нему отладчиком.
Внимательно смотрите за регистрами из группы *Х.
[code lang=asm]org 100h
; mov al,[a] ; al=a
mov bl,[c] ; bl=c
xor dl,dl
mov cl,3 ; cl=b=10
lab1:
mov al,[a]
add al,cl ; al=al+cl
div bl ; al=ax/bl
add dl,al
loop lab1
mov [f],al
;--------------------
a db 1
c db 1
f db 3 [/code]
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403037
55
21.05.2019, 19:58
общий
Цитата: Зенченко Константин Николаевич
Вот вариант проще, по пробуйте его скомпилировать и пройти по нему отладчиком.


Все компилируется и работает , а все таки мой вариант имеет право на жизнь?
давно
Посетитель
7438
7205
21.05.2019, 20:15
общий
Я с телефона :)
Не забывайте: использование loop
не даст отработать для b=cx=0
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
21.05.2019, 20:23
общий
Адресаты:
Цитата: lordwarrior161
а все таки мой вариант имеет право на жизнь

Да но с оговорками.
Вы должны где то накапливать СУММУ, а этого Вы не делаете(у меня это регистр DL, add dl,al стоит сразу после диления). У Вас каждый раз считается (A+Bi)/C,но сама сумма нигде не сохраняется.
Цитата: lordwarrior161
Все компилируется и работает

То,что он компилируется и работает я знаю, я предлогал Вамзарегистрами следить.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
21.05.2019, 20:47
общий
Цитата: Лысков Игорь Витальевич
Не забывайте: использование loop не даст отработать для b=cx=0

По условию у нас В>=0, а это значит, (А+0)/С должно быть посчитано в любом случае.
Используется целочисельное деление и остаток нигде не учитывается, при С=1 это не видно, но при любом другом, это будет заметно.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
24.05.2019, 23:27
общий
24.05.2019, 23:32
Адресаты:
Цитата: lordwarrior161
тогда может в предыдущих моих консультациях я зря переменные брал в квадратные скобки

У Вас методичка TASM | MASM, но Вы выбрали FASM.
Я Вам покажу различия, этих компилятоов: Это практически самое основное их различие.

Код TASM | MASM, на картинке он будет слева:
[code lang=asm]model tiny
.code
org 100h
beg:
a dw 9090h
mov ax,a
lea ax,a
mov ax,offset a
end beg[/code]
Код FASM:
[code lang=asm]org 100h
a dw 9090h
mov ax,[a]
mov ax,a[/code]
Обратите внимание, во сколько длинее первый листинг. a dw 9090h, специально помещен по этому адресу, чтобы не было различий в командах, сам код 0x90 - команда NOP, все это расматривается одним отладчиком.

Что видно, TASM | MASM, предоставляет кучу возиожностей получения адреса и самого значения, но в отладчике эти записи, совсем не совпадают с тем, как понимает это сам отладчик. В FASM, что Вы написали, то и имеете в отладчике. Эти все условности, "тут играем, тут не играем, а тут мы рыбу заворачивали"(в сети должно быть выступление ещё советских комиков). Т.е. держать в голове(знать несколько ситнтаксисов, и пратически быстро учитывать эти особенности), для начинающего - опасно.
Ну, приведу ещё одну алегорию, Русский Язык: Вы пишете "кого", а читаете совсем не так- это TASM | MASM,.в FASM, что Вы написали, то и читаете.


Поздравляю Вы интуитивно выбрали FASM, и теперь Вам на "люминий" не нужно говорить "белый, легкий, твердый метал".
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403037
55
24.05.2019, 23:36
общий
Адресаты:
Спасибо большое за развёрнутый ответ , просто FASM было проще всего установить, поэтому его и использовал, но не знал, что между компиляторами есть такие различия.
давно
Старший Модератор
31795
6196
24.05.2019, 23:53
общий
Адресаты:
я продлил, оба Ваших вопроса, но постараюсь дать ответ в ближайшие дни.
Уточните все таки DB или DW.
А, еще FASM, не создает промежуточных фалов и отладочной информации в файл не добавляет, с одной стороны - плюс: не нужно читиль специально диск, но сдругой стороны - минус: код на FASM, нельзя интегрировать в другие языки.
Если с установкой МАСМ есть проблемы, особенно старых версий, то с ТАСМ - тут качаете, распаковываете в нужную папку, правда работа только с командной строки, как и МАСМ.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
24.05.2019, 23:54
общий
Адресаты:
Цитата: lordwarrior161
не знал, что между компиляторами есть такие различия.


Вы ещё NASM не видели.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403037
55
25.05.2019, 00:07
общий
Цитата: Зенченко Константин Николаевич
я продлил, оба Ваших вопроса, но постараюсь дать ответ в ближайшие дни.

Так вроде бы уже все вопросы решены

Цитата: Зенченко Константин Николаевич
Уточните все таки DB или DW.


А это вы про что сейчас?
давно
Старший Модератор
31795
6196
25.05.2019, 00:17
общий
25.05.2019, 00:20
Адресаты:
8 или 16 -ть бит.

Цитата: lordwarrior161
Так вроде бы уже все вопросы решены

Для Вас - да, есть ещё читатели:


На число посмотрите.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403037
55
25.05.2019, 00:21
общий
Цитата: Зенченко Константин Николаевич
8 или 16 -ть бит.


Ну все таки 8 бит
давно
Старший Модератор
31795
6196
31.05.2019, 11:17
общий
это ответ
Здравствуйте, lordwarrior161!
Правильный код будет, таким:
[code lang=asm]org 100h
xor dl,dl;тут будет сумма
mov bl,[b];счетчик
@@01: mov al,[a];грузим А
add al,bl;добавляем счетчик
div [c];делим на С
add dl,al;суммируем
dec bl;уменьшаем счетчик
jns @@01[/code]
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа