Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 27.04.2014
Сообщений: 62

Бесконечное повторение кода после команды IDIV

02.10.2016, 01:32. Показов 4431. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
После idiv зацикливается



Вот сам код (буду благодарен если проверите на остальные косяки )

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
.MODEL TINY 
.386 
stack 256 
DATASEG 
x1 db 10 
x2 db 27 
x3 db 11101100b 
 
 
sum db 0 
raz db 0 
proiz dw 1 
ostotdel db 2 
chast db 2 
 
CODESEG 
start: 
 
 
mov al, x1 
add al, x2 
mov sum, al 
 
mov al, x2 
sub al, x1 
mov raz, al 
 
mov al, x2 
neg x2 
sub al, x1 
 
mov al, x1 
cbw 
mov bl, x2 
cbw 
neg bx 
imul bx 
mov proiz, ax 
 
mov al, x1 
cbw 
mov bl, x2 
cbw 
neg bx 
mul bx 
 
mov al, x2 
cbw 
mov bl, x1 
idiv bl 
mov chast, al 
mov ostotdel, ah 
 
mov al, x3 
cbw 
bts ax, 1 
bts ax, 3 
not ax 
and ax, 11110001b 
 
mov bx, ax 
xor ax, bx 
 
 
 
 
mov ax,4C00h 
int 21h 
 
END start
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.10.2016, 01:32
Ответы с готовыми решениями:

Некорректное деление с использованием команды idiv
Добрый день. Столкнулся с проблемой: после выполнения команды idiv (код программы ниже) происходит не то, что хотелось бы, а именно SP...

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

Как сделать бесконечное повторение?
Есть вот такой скрипт using System.Collections; using System.Collections.Generic; using UnityEngine; public class camemove :...

25
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 853
02.10.2016, 08:54
slavik57, команда CBW работает только с регистром AL(расширяя его знак на AH), поэтому код в строках 35 и 43 не имеет смысла, ибо BL до BX он не расширит. Если надо из знакового байта сделать слово - помещай его в AL.

Непонятно, зачем идёт вычитание в строке 30, если следом результат заменяется значением переменной(стока 32).
Судя по скринам, возможно "деление на ноль". Измени указанные косяки, возможно поможет.
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
02.10.2016, 10:37
У Вас происходит деление на 0. Это и в отладчике видно, все регистры по 0. И что хотите сделать строкой mov al, x3 непонятно.

Добавлено через 1 час 17 минут
попробуй

Assembler
1
2
3
4
5
start:
 
mov ax,DATASEG 
mov ds,ax
xor ax,ax
и дальше по программе с учетом замечаний
1
1 / 1 / 0
Регистрация: 27.04.2014
Сообщений: 62
02.10.2016, 22:12  [ТС]
Вот так всё заработало
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
.MODEL TINY 
.386 
stack 256 
DATASEG 
x1 db 10 
x2 db 27 
x3 db 11101100b 
 
 
sum db 0 
raz db 0 
proiz dw 1 
ostotdel db 2 
chast db 2 
 
CODESEG 
start: 
 
 
mov ds, ax 
xor ax, ax 
 
mov al, x1 
add al, x2 
mov sum, al 
 
mov al, x2 
sub al, x1 
mov raz, al 
 
mov al, x2 
neg x2 
sub al, x1 
 
mov al, x1 
cbw 
mov bl, x2 
neg bx 
imul bx 
mov proiz, ax 
 
mov al, x1 
cbw 
mov bl, x2 
neg bx 
mul bx 
 
mov al, x2 
mov bl, x1 
idiv bl 
mov chast, al 
mov ostotdel, ah 
 
mov al, x3 
cbw 
bts ax, 1 
bts ax, 3 
not ax 
and ax, 11110001b 
 
mov bx, ax 
xor ax, bx 
 
 
 
 
mov ax,4C00h 
int 21h 
 
END start
Цитата Сообщение от мановар Посмотреть сообщение
И что хотите сделать строкой mov al, x3
перенести в al значение x3, тобиш 11101100b

Только вот почему при команде
Assembler
1
mov al, x1
в TD показано, что ax становится равным 40, когда у нас x1 = 10 в десятичной или A в 16-ой
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
02.10.2016, 22:44
А где загрузка сегмента данных mov ax,DATASEG как указывал?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
02.10.2016, 23:34
Тут "или крест снимите или трусы оденьте".
Или модель TINY+JMP, или загрузка сегмента.
Может быть повезло - линкер расположил сегменты по алфавиту.
2
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
03.10.2016, 06:16
ФедосеевПавел, собирал на Fasm, залез в отладчик, все нормально, про ASSUME из головы вылетело, давно не пользовался.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
03.10.2016, 12:45
Лучший ответ Сообщение было отмечено slavik57 как решение

Решение

Ученики часто путаются в моделях программ (и, соответственно, в стартовом и финальном кодах). Наверное, мне нужно было просто пояснить для slavik57 различия, а не выкручиваться.

slavik57, чуть позже вы сами разберётесь. А пока просто примите как рецепт (заклинание), что для DOS программ есть несколько моделей организации программ (если не путаю - tyny, small, medium, huge - подробнее https://www.cyberforum.ru/post5323068.html). Они различаются способами размещения сегмента (сегментов) данных относительно сегмента кода. И соответственно, в коде (в начале и в конце) для них существуют "стандартные" строки - так называемые пролог и эпилог. При компиляции добавляются различные ключи в командной строке линкера.
Для tiny (*.com) при организации данных после кода
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
; tasm /m keycode1.asm
; tlink /t /x keycode1.obj
 
.MODEL Tiny
.CODE
ORG 100h
 
Start:
        ;отсюда начинается код программы
..........................................................
        ;эпилог
        int 20h            ; Выход
 
;организация данных после кода
Question    db  'Вы хотите этого :) (Y/N)?$'
YesMessage  db  13,10,'Выбран ответ "да"$'
NoMessage   db  13,10,'Выбран ответ "нет"$'
 
END     Start
Или, если организовать данные перед кодом программы
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; tlink /t /x keycode1.obj
 
.MODEL Tiny
.CODE
ORG 100h
 
Start:
                jmp main
 
;организация данных перед кодом
Question    db  'Вы хотите этого :) (Y/N)?$'
YesMessage  db  13,10,'Выбран ответ "да"$'
NoMessage   db  13,10,'Выбран ответ "нет"$'
 
                ;отсюда начинается код программы
main:
..........................................................
        ;эпилог
        int 20h            ; Выход
 
END     Start
Для остальных DOS (*.exe)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
; tasm /m malloc2e.asm
; tlink /x malloc2e.obj
 
.MODEL Small
 
.STACK  100h
 
.DATA
 
NotEnoughMemMsg db  'Не хватает памяти!',13,10,'$'
 
.CODE
 
Start:
        ; пролог
        mov ax,@data
        mov ds,ax          ; DS = сегмент .DATA
 
..........................................................
 
        ;эпилог
        mov ax,4C00h
        int 21h            ; Выходим из программы
 
END     Start
Эти примеры для пакета tasm. Для других пакетов могут несколько отличаться "встроенные" названия сегментов (вместо @data что-нибудь другое). Также возможны вариации по организации кода в виде процедур. Например, вот чья-то усечённая лабораторка с применением подпрограмм и организации главной программы как процедуры
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
.model small
LOCALS @@
.stack  100h
.data
 
Rows     equ    4              ;максимальное количество строк
Columns  equ    4              ;максимальное количество столбцов
 
m        dw     Rows           ;текущее количество строк
n        dw     Columns        ;текущее количество столбцов
 
.code
 
; На входе
; ax - число
; bx - система счисления
; cx - максимальная длина строки
; si - адрес строки
SPrintf PROC
...........................
        ret
SPrintf ENDP
 
; На входе
;bx    - система счисления
;ds:dx - указатель на строку формата
;        0 байт - длина строки (0..255)
;        1 байт - начало строки
;ds:di - указатель на байт, куда будет помещён результат
; На выходе
;CY    - если установлен - ошибка преобразования строки в число
SScanf  PROC
...................................
        ret
SScanf  ENDP
 
Main    PROC    FAR
        mov     dx, @data
        mov     ds, dx
 
.............................
 
        mov     ax, 4c00h
        int     21h
Main    ENDP
 
END     Main
3
1 / 1 / 0
Регистрация: 27.04.2014
Сообщений: 62
03.10.2016, 15:49  [ТС]
Не могу понять как ведут себя регистры в TD
Кликните здесь для просмотра всего текста
http://********/LhAu



у меня криво что-то сделано? или так и должно быть?
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
03.10.2016, 16:26
Поспешишь - людей насмешишь. Это я о себе. Slavik57 выложи код который у тебя получился. В чем компилируешь Masm,Tasm?
0
1 / 1 / 0
Регистрация: 27.04.2014
Сообщений: 62
03.10.2016, 20:25  [ТС]
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
.MODEL TINY 
.386 
 
.CODE 
ORG 100h 
 
start: 
 
 
mov ds, ax 
xor ax, ax 
 
mov al, x1 
add al, x2 
mov sum, al 
 
mov al, x2 
sub al, x1 
mov raz, al 
 
mov al, x2 
neg x2 
sub al, x1 
 
mov al, x1 
cbw 
mov bl, x2 
neg bx 
imul bx 
mov proiz, ax 
 
mov al, x1 
cbw 
mov bl, x2 
neg bx 
mul bx 
 
mov al, x2 
mov bl, x1 
idiv bl 
mov chast, al 
mov ostotdel, ah 
 
mov al, x3 
cbw 
bts ax, 1 
bts ax, 3 
not ax 
and ax, 11110001b 
 
mov bx, ax 
xor ax, bx 
 
 
 
 
int 20h 
 
 
 
x1 db 10 
x2 db 27 
x3 db 11101100b 
 
 
sum db 0 
raz db 0 
proiz dw 1 
ostotdel db 2 
chast db 2 
 
 
 
END start
TASM
/TASM /m .asm
/TLINK /v .obj

Предупреждение про стек писало после TLINK
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
03.10.2016, 20:49
slavik57, если делаешь как у ФедосеевПавел код №1, то убери строки 10-11. У меня все скомпилировалось, получился файл с расширением com (как компилировать вверху кода). Под отладчиком все нормально (в al загружает 10 затем складывает, дальше не проверял)
0
1 / 1 / 0
Регистрация: 27.04.2014
Сообщений: 62
03.10.2016, 21:48  [ТС]
Компилится MS-DOS приложение, которое как я понимаю в TD не запустишь, если я хочу exe, мне нужно собирать(или как это называется) с параметрами /m и /v, но тогда у меня TD показывает какую-то х@ю(скрины выше прикреплял) или я просто не понял и регистры al и ax в TD не одно и тоже, тогда как узнать значения, если у меня всё идёт через al и bl
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
03.10.2016, 22:39


TD запускаю в файловом менеджере Far. Прекрасно все загружает. Как видим, после сложения в AL - 25, что соответствует 37 дес. системе.
1
1 / 1 / 0
Регистрация: 27.04.2014
Сообщений: 62
06.10.2016, 22:54  [ТС]
Странно, у меня far не видит ms-dos
Миниатюры
Бесконечное повторение кода после команды IDIV  
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
06.10.2016, 23:07
slavik57, у тебя какое расширение исполняемого файла com или exe. Если com, что и должно было получиться если все правильно делал, в TD исправь под File name *.exe на *.com
0
1 / 1 / 0
Регистрация: 27.04.2014
Сообщений: 62
06.10.2016, 23:24  [ТС]
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
.MODEL TINY 
.386 
 
.CODE 
ORG 100h 
 
start: 
 
mov al, x1 
add al, x2 
mov sum, al 
 
mov al, x2 
sub al, x1 
mov raz, al 
 
mov al, x2 
neg x2 
sub al, x1 
 
mov al, x1 
cbw 
mov bl, x2 
neg bx 
imul bx 
mov proiz, ax 
 
mov al, x1 
cbw 
mov bl, x2 
neg bx 
mul bx 
 
mov al, x2 
mov bl, x1 
idiv bl 
mov chast, al 
mov ostotdel, ah 
 
mov al, x3 
cbw 
bts ax, 1 
bts ax, 3 
not ax 
and ax, 11110001b 
 
mov bx, ax 
xor ax, bx 
 
 
 
 
int 20h 
 
 
 
x1 db 10 
x2 db 27 
x3 db 11101100b 
 
 
sum db 0 
raz db 0 
proiz dw 1 
ostotdel db 2 
chast db 2 
 
 
 
END start
этот код в TD выдаёт
Миниатюры
Бесконечное повторение кода после команды IDIV  
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
06.10.2016, 23:28
Ну нет и нет символьной таблицы. Отлаживайте без неё.

Для получения отладочной информации нужно компилировать и линковать с ключами, тогда и в TD будет не "голый" асм, а исходный текст.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
07.10.2016, 10:49
slavik57, 17-19 результат никуда не записывается, аналогично 28-32
0
1 / 1 / 0
Регистрация: 27.04.2014
Сообщений: 62
07.10.2016, 18:09  [ТС]
знаю, но по заданию нужно сделать без присваивания
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.10.2016, 18:09
Помогаю со студенческими работами здесь

Бесконечное повторение цикла по добавлению строки
ох и достал я всех тут наверно.. но т.к. учусь, все равно задам вопросик Private Sub CommandButton1_Click() With...

Как сделать бесконечное повторение вывода текста
Как сделать бесконечное повторение вывода текста в PascalABS.NET Надо вывести текст: writeln ('текст 'переменная 'текст );...

Не используя команды div, sub или idiv поделить число на 4
mov AL,number sar AL,2 number db ? Вот это кусочек программа для деления на 8, но нужно на 4, а я не как не вдуплюсь, как это...

команды умножения и деления со знаком и без знака mul,imul,div,idiv
Добрый день. В общем то задание написать программу на С++ ,которая показывала бы исполнения команд mul,imul,div,idiv. Нашла кучу программ и...

Повторение команды
Я хочу сделать повторение команды если одно из чисел меньше 0 , но оператор с помощью оператора while не получается. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru