Консультация № 195663
19.05.2019, 18:12
0.00 руб.
0 32 0
Здравствуйте! У меня возникли сложности с таким вопросом:

В ассемблере понимаю ровно 0, делаю практическую работу, нужно вычислить выражение: F=(a+b)/c

Работаю в FASM в Windows XP( виртуальная )

сваял вот такой код:



use16


mov ax,a ; ax=a
mov bx,b ; bx=b
add ax,bx ; ax=ax+bx
mov dx,c ; dl=c
div dx ; al=ax/dl
mov al,f


;---------

a db 2
b db 2
c db 2
f db ?

но совсем не уверен, что правильно.
прошу подсказать и поправить. Спасибо.

Обсуждение

давно
Посетитель
403037
55
19.05.2019, 19:14
общий
19.05.2019, 19:16
Цитата: Зенченко Константин Николаевич
Вам нужно определится с разрядностью операндов.


8 бит конечно же

Переделал

;F=(a+b)/c



mov al,a ; al=a
mov bl,b ; bl=b
add al,bl ; al=al+bl
mov cl,c ; cl=c
div cl

;-------------------------
a db 2
b db 2
c db 2

но опять же уверенности в правильности никакой

еще не могу понять, как вывести результат в переменную f
давно
Старший Модератор
31795
6196
19.05.2019, 19:15
общий
Адресаты:
а блин это FASM, получение значения только через [ a ], команда mov ax,a получает адрес переменной а.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
19.05.2019, 19:31
общий
Адресаты:
1) Вы пытаетесь создать BIN, у Вас это получилось.
2) Для СОМ нужно указывать директиву ORG
3) исправленный вариант:
[code lang=asm]use16

org 100h
mov al,[a] ; ax=a
mov bl,[b] ; bx=b
add al,bl ; ax=ax+bx
mov cl,[c] ; dl=c
div cl ; al=ax/dl
nop
;mov al,f
;---------
a db 2
b db 2
c db 2
f db ? [/code]
Команду ;mov al,f - я исключил, т.к. Вы целую часть деления пытаетесь переписать.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
19.05.2019, 19:38
общий
Адресаты:
Слегка изменил данные, и видно результат деления.
Прикрепленные файлы:
3818b5c707d34146dcc1f7aa5810eb7e.jpg
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
402218
66
19.05.2019, 19:42
общий
Адресаты:
Да, эти синтаксисы fдостают, Я на fasm'е практикую, но почему то не обратил внимания как берётся значение из переменной. Порой думаю, лучше бы не знал Я никакого masm'a и tasm'а, столько уже в просак попадал из-за синтаксиса
давно
Старший Модератор
31795
6196
19.05.2019, 19:47
общий
Адресаты:
Цитата: Kdsfofwe21
так же если деление производите посредством операнда DX, и в тоже время у Вас там находится делимое, то сомневаюсь что там будет хорошо, поэтому используйте div dl.

По умолчанию делится EDX : EAX на 32 бита, DX : AX на 16 бита, AX на 8 бит, но в любом случае избегание этих регистров по умолчанию, избавляет от вероятных ошибок.
Цитата: Зенченко Константин Николаевич
это пока основная ошибка.это пока основная ошибка.

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

давно
Посетитель
403037
55
19.05.2019, 19:50
общий
Цитата: Зенченко Константин Николаевич
3) исправленный вариант:


Огромное вам спасибо , но все таки, как вывести результат в F?
Код:
mov dl,f
?
давно
Старший Модератор
31795
6196
19.05.2019, 19:51
общий
Адресаты:
Цитата: Kdsfofwe21
уже в просак попадал

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

давно
Старший Модератор
31795
6196
19.05.2019, 19:55
общий
Адресаты:
Цитата: lordwarrior161
как вывести результат в F?

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

давно
Посетитель
403037
55
19.05.2019, 20:13
общий
Цитата: Зенченко Константин Николаевич
Но одновременное использование память, память - не допустимо.


тогда как из этой ситуации выйти? или это в принципе невозможно? просто в той теории, которую я изучаю, этого момента не описано, а в примере есть
давно
Посетитель
402218
66
19.05.2019, 20:18
общий
Адресаты:
Цитата: lordwarrior161
© Цитата: Зенченко Константин Николаевич
Но одновременное использование память, память - не допустимо.Но одновременное использование память, память - не допустимо.


ключевое слово - "одновременно". была конструкция: память-память, что невозможно. То есть надо сначала положить одну из переменных, которая хранится в памяти, в какой либо регистр. и получится конструкция: регистр-память.
давно
Посетитель
403037
55
19.05.2019, 20:30
общий
Цитата: Kdsfofwe21
надо сначала положить одну из переменных, которая хранится в памяти, в какой либо регистр


вас понял. еще раз большое спасибо
давно
Старший Модератор
31795
6196
19.05.2019, 22:18
общий
Адресаты:

Крутитесь как хотите:
Раз Вы подключились, то от имени Портала и по поручению Портала, прошу Вас компилировать мини-форум и оформить ответ.
Вам таки плюс будет.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
19.05.2019, 23:11
общий
Цитата: Kdsfofwe21
Порой думаю, лучше бы не знал Я никакого masm'a и tasm'а,

Ну masm это понятно, а tasm - знать сам БОГ велел.
Смотрите сами, даже TASM знал о:
[code lang=asm]Turbo Assembler Version 2.0
1 0000 model tiny,pascal
2 0000 .code
3 org 100h
4 0100 b: call a,ax,bx
1 5 0100 50 PUSH AX
1 6 0101 53 PUSH BX
1 7 0102 E8 0001 CALL A
8 0105 C3 ret
9 0106 proc a,c:word,d:word
1 10 0106 55 PUSH BP
1 11 0107 8B EC MOV BP,SP
1 12 0109 8B 7E 06 mov di,c
13 010C 8B 76 04 mov si,dгг
1 14 010F 5D POP BP
1 15 0110 C2 0004 RET 0004h
16 0113 a endp
17 end b[/code]
Но просто запомните, что WIN'ь TASM начал поддерживать только с версии 5+, это равноценно masm 6.14, но в MASM invoke появилась "потом", и без PROTO работать не умела, TASM уже при DOS-версиях сам поддерживал "invoke", при этом без всяких прототипов.
Те знания и идеи. которые были у разработчиков могли свернуть горы, но менеджеры "всё"-"не","дайте мне денег","мне пофиг"-"знайки", в то время просто слили компанию, и весь коллектив.
Вот такая печальная история.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
402218
66
20.05.2019, 03:36
общий
Адресаты:
то есть, елси бы тасм продолжали бы разрабатывать, то он бы переплюнул фасм? Или на счёт "переплюнул фасм" Я мог перегнуть, и тасм до сих пор по возможностям превосходит другие компиляторы?
давно
Старший Модератор
31795
6196
20.05.2019, 10:58
общий
20.05.2019, 11:02
Адресаты:
Я Вам показал, что TASM
[code lang=asm]call a,ax,bx [/code]
делал аналог invoke, ещё до того, когда над его(invoke) созданием задумались разработчики MASM.
В TASM, есть два режима: MASM-совместимость и IDEAL. Первый- понятно, а вот со вторым сложнее, там столько "плюшек"-"вкусняшек", что я за почти 20-лет, со всеми ещё не разобрался.
Т.к. вопросов по идеалу нет, а заниматься чисто идеалом у меня времени тоже почти нет, а то, что осталось почти всегда съедает "рутина".
Цитата: Kdsfofwe21
то есть, если бы тасм продолжали бы разрабатывать,

Его последняя разработка маркируется как

А теперь, просто включите фантазию и представьте, что могли бы на фантазировать эти парни, с учетом современных тенденций.
Вот и я о том.

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

давно
Старший Модератор
31795
6196
20.05.2019, 11:42
общий
Адресаты:
Цитата: lordwarrior161
тогда как из этой ситуации выйти? или это в принципе невозможно? просто в той теории, которую я изучаю, этого момента не описано, а в примере есть

У Вас результат хранится в регистрах AL-целая часть, AH-остаток.
У Вас не вывода результата на экран, т.е. Вы будете контролировать работу кода в отладчике, тыкаете пальцем на регистры преподу, пусть смотрит.
Но если нужно именно сохранить реультат, то ещё раз напомню:
Цитата: Зенченко Константин Николаевич
MOV <приемник>(регистр, память),<источник>(регистр, память, число).
Но одновременное использование память, память - не допустимо.

допустимые команды
mov [ a ],al;память - регистр
mov [ a ],0Fh;память - число
mov al,[ a ];регистр -память
mov al,0Fh;регистр -число
mov al,bl;регистр - регистр
нельзя делать
mov [ a ],[ b ] - это
одновременное использование память, память
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
20.05.2019, 11:47
общий
Адресаты:
Присоединяюсь к просьбе Константина Николаевича: с Вас ответ
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
403037
55
20.05.2019, 12:18
общий
Цитата: Зенченко Константин Николаевич
Слегка изменил данные, и видно результат деления.


а вот у меня к сожалению даже после изменения данных значения не меняются

вот код, немного его изменил

Код:
use16

org 100h
mov al,[a] ; al=a
mov bl,[b] ; bl=b
add al,bl ; al=al+bl
mov dl,[c] ; dl=c
div dl ; al=ax/dl
nop
mov al,[f]
;---------
a db 10
b db 10
c db 20
f db ?
Прикрепленные файлы:
bee711e41aae024018e9bca03ac1f60c.png
давно
Старший Модератор
31795
6196
20.05.2019, 12:56
общий
Адресаты:
Цитата: Зенченко Константин Николаевич
Команду ;mov al,f - я исключил, т.к. Вы целую часть деления пытаетесь переписать.

Вы так и не поняли
mov al,[ f ]-записывает в регистр значение переменной F
Вам вместо этой команды нужно MOV [ F ],AL.
По коду все правильно 1010+1010=2010=1416
2010/2010=1в любой системе даже двоичной
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403037
55
20.05.2019, 13:12
общий
Цитата: Зенченко Константин Николаевич
Вам вместо этой команды нужно MOV [ F ],AL.


каюсь, не досмотрел. Теперь понял.

еще не понятен момент:
Код:
div dl ; al=ax/dl
- тут именно ax/dl или все таки al/dl?
давно
Старший Модератор
31795
6196
20.05.2019, 13:20
общий
Адресаты:
Я уже писал, что
Цитата: Зенченко Константин Николаевич
По умолчанию делится EDX : EAX на 32 бита, DX : AX на 16 бита, AX на 8 бит

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

давно
Старший Модератор
31795
6196
20.05.2019, 13:30
общий
20.05.2019, 13:31
Адресаты:
Цитата: Лысков Игорь Витальевич
с Вас ответ

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

давно
Посетитель
403037
55
20.05.2019, 14:14
общий
20.05.2019, 14:29
Цитата: Зенченко Константин Николаевич
тыкаете пальцем на регистры преподу, пусть смотрит


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

[code lang=asm]
;найти f=(a+b)/c


use16
org 100h
mov al,[a] ; al=a
mov bl,[b] ; bl=b
add al,bl ; al=al+bl
mov dl,[c] ; dl=c
div dl ; al=ax/dl
nop
mov [f],al
;---------
a db 2
b db 2
c db 2
f db ?
[/code]

вот что у меня в итоге получилось, если уж и это неправильно, то придется менять специальность
давно
Посетитель
7438
7205
20.05.2019, 14:28
общий
20.05.2019, 14:32
Адресаты:
Можно, я тоже вставлю свои пять копеек?
Все почти хорошо. За исключением одного момента. Делиться должно же AX.
А что находится в AH? Обычно при старте регистр AX обнуляется, но лучше это сделать явно, перед делением вставить [code lang=asm]mov ah, 0[/code]Есть еще один момент (можно и не учитывать, если устраивает то, что есть):
хорошо, если сумма двух байт поместится в байт, а если нет? Для большей универсальности я бы предложил чуть подправить: [code lang=asm]xor ax, ax ; ax=0
xor bx, bx ; bx =0
mov al,[a] ; ax=a
mov bl,[b] ; bx=b
add ax,bx ; ax=ax+bx
mov dl,[c] ; dl=c
div dl ; al=ax/dl[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
20.05.2019, 14:31
общий
Адресаты:
если уж и это неправильно, то придется менять специальность
Все начинали с того, что не знали элементарное
Было бы желание! Все придет!
Не понятно, заходите к нам, задавайте вопросы, поможем, разжуем, в рот покладем...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
403037
55
20.05.2019, 14:37
общий
Всем огромнейшее спасибо за развернутые ответы

Вопросы еще будут, но уже в других темах, я новичок, поэтому сильно не ругайтесь
давно
Старший Модератор
31795
6196
20.05.2019, 14:49
общий
Адресаты:
Ура! Вам не нужно:
Цитата: lordwarrior161
менять специальность


Все правильно!
Но
Это ассемблер, оптимальное решение ну типа такое:
[code lang=asm]use16
org 100h
xor ah,ah
mov al,[a]; al=a
;mov bl,[b];bl=b
add al,[b]; al=al+b
;mov dl,[c]; dl=c
div [c];al=ax/c
mov [f],al
;---------
a db 2
b db 2
c db 2
f db ? [/code]
Простите, что сразу не ответили правильно, но у Вас появился опыт!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
402218
66
20.05.2019, 16:36
общий
Адресаты:
Вы с Константином больше там написали, что аж Я просто не могу взять чужой труд :). так что уж Вы пишите ответ, а Я так, для поддержки штанов тут :). Меня самого надо ещё учить и учить.
давно
Посетитель
7438
7205
20.05.2019, 17:31
общий
Адресаты:
Мы за все время столько поотвечали, что только будем рады, если ответите Вы. Правда-правда...
А учиться, уча других, - далеко не худший путь... Так что, предложение остается в силе, ответ с Вас.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа