1 / 1 / 1
Регистрация: 20.01.2013
Сообщений: 80
1

Int 20 в dosbox

08.09.2016, 19:00. Показов 1202. Ответов 6
Метки нет (Все метки)

Помогите пожалуйста с программой. Как реализовать int 20 в данном коде. Если int 20 встречается только 1 раз в коде, то можно писать g xxxx(адрес конечной команды). А если несколько раз...
Миниатюры
Int 20 в dosbox   Int 20 в dosbox   Int 20 в dosbox  

Int 20 в dosbox   Int 20 в dosbox  
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.09.2016, 19:00
Ответы с готовыми решениями:

Какая из этих функций int Q(int w) int W(int y,int u,int i) сработает быстрее?
Если есть 2 функции(простые или перегруженные) к примеру Q(int w) int W(int y,int u,int i)или int...

Не работает перегрузка индексного оператора [], вместо [int][int] почему то нужно ставить [0][int][int]
#include<iostream> #include<string> #include<vector> #include<algorithm> #include<ctime>...

Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec
Вот есть заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H #define VECTOR_H ...

[C++ Error] Unit2.cpp(22): E2034 Cannot convert 'int (*)(int,int *)' to 'int'
Всем привет! Пожалуйста , помогите , почему выдает ошибку Unit2.cpp(22): E2034 Cannot convert 'int...

6
1 / 1 / 1
Регистрация: 20.01.2013
Сообщений: 80
08.09.2016, 19:01  [ТС] 2
Продолжение
Миниатюры
Int 20 в dosbox   Int 20 в dosbox   Int 20 в dosbox  

Int 20 в dosbox   Int 20 в dosbox  
0
Эксперт Hardware
5349 / 1893 / 351
Регистрация: 29.07.2014
Сообщений: 2,823
Записей в блоге: 5
08.09.2016, 19:42 3
Vahram1995, исходник покажи.
Зачем столько int-20h в одном коде? Поставь метку до INT-20, и когда надо - указывай адрес этой метки.
0
1 / 1 / 1
Регистрация: 20.01.2013
Сообщений: 80
08.09.2016, 19:51  [ТС] 4
https://drive.google.com/file/... ptVVE/view - источник, третий пример.
Пример 3
Пример 3. Написать программу, которая выполняет сравнение двух чисел, введенных пользователем с клавиатуры.
1) Подготовка данных (строк) для вывода на экран
Разместим в памяти строки, выводимые при диалоге с пользователем программы. Для перехода на новую строку будем вводить перед каждой
строкой по два байта 0d 0a.
Запускаем DEBUG и записываем в память строки. Запоминаем адреса начала строк, для последующего обращения к ним из программы. Строки будем записывать в сегменте DS, начиная с адреса 200. Предварительно убедимся, что в данной области отсутствуют данные:
Код
-d 200
13F4:0200 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13F4:0210 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13F4:0220 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13F4:0230 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13F4:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13F4:0250 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13F4:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13F4:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
Вводим в память два байта 0d и 0a в адреса 13F4:0200 и 13F4:0201 соответственно, далее с адреса 13F4:0202 расположим первую строку программы «The program comparing two numbers$»:
Код
-e 200
13F4:0200 00.0d 00.0a
-e 202 "The program comparing two numbers$"
-d 200
13F4:0200 0D 0A 54 68 65 20 70 72-6F 67 72 61 6D 20 63 6F ..The program co
13F4:0210 6D 70 61 72 69 6E 67 20-74 77 6F 20 6E 75 6D 62 mparing two numb
13F4:0220 65 72 73 24 00 00 00 00-00 00 00 00 00 00 00 00 ers$............
13F4:0230 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13F4:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13F4:0250 00 00 00 00 00 00 00 00-00 00 00 01 20 04 00 00 ............ ...
13F4:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13F4:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
Последний байт введенной строки размещен по адресу 13F4:0223 символ $), поэтому ввод следующей строки начнем с адреса 13F4:0224 (байт выделен на листинге зеленым цветом). После ввода каждой строки будем просматривать дамп памяти для определения адреса ввода следующей строки.
Код
-e 224
13F4:0224 00.0d 00.0a
-e 226 "Input first number (X): $"
-d 200
13F4:0200 0D 0A 54 68 65 20 70 72-6F 67 72 61 6D 20 63 6F ..The program co
13F4:0210 6D 70 61 72 69 6E 67 20-74 77 6F 20 6E 75 6D 62 mparing two numb
13F4:0220 65 72 73 24 0D 0A 49 6E-70 75 74 20 66 69 72 73 ers$..Input firs
13F4:0230 74 20 6E 75 6D 62 65 72-20 28 58 29 3A 20 24 00 t number (X): $.
13F4:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13F4:0250 00 00 00 00 00 00 00 00-00 00 00 01 20 04 00 00 ............ ...
13F4:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13F4:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-e 23f
13F4:023F 00.0d 00.0a
-e 241 "Input second number (Y): $"
-d 200
13F4:0200 0D 0A 54 68 65 20 70 72-6F 67 72 61 6D 20 63 6F ..The program co
13F4:0210 6D 70 61 72 69 6E 67 20-74 77 6F 20 6E 75 6D 62 mparing two numb
13F4:0220 65 72 73 24 0D 0A 49 6E-70 75 74 20 66 69 72 73 ers$..Input firs
13F4:0230 74 20 6E 75 6D 62 65 72-20 28 58 29 3A 20 24 0D t number (X): $.
13F4:0240 0A 49 6E 70 75 74 20 73-65 63 6F 6E 64 20 6E 75 .Input second nu
13F4:0250 6D 62 65 72 20 28 59 29-3A 20 24 00 00 00 00 00 mber (Y): $.....
13F4:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13F4:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
Последовательно записываем в память строки, которые будут выводиться на экран после сравнения введенных чисел:
Код
-e 25b
13F4:025B 00.0d 00.0a
-e 25d "X>Y$"
-d 200
13F4:0200 0D 0A 54 68 65 20 70 72-6F 67 72 61 6D 20 63 6F ..The program co
13F4:0210 6D 70 61 72 69 6E 67 20-74 77 6F 20 6E 75 6D 62 mparing two numb
13F4:0220 65 72 73 24 0D 0A 49 6E-70 75 74 20 66 69 72 73 ers$..Input firs
13F4:0230 74 20 6E 75 6D 62 65 72-20 28 58 29 3A 20 24 0D t number (X): $.
13F4:0240 0A 49 6E 70 75 74 20 73-65 63 6F 6E 64 20 6E 75 .Input second nu
13F4:0250 6D 62 65 72 20 28 59 29-3A 20 24 0D 0A 58 3E 59 mber (Y): $..X>Y
13F4:0260 24 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 $...............
13F4:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-e 261
13F4:0261 00.0d 00.0a
-e 263 "X<Y$"
-d 200
13F4:0200 0D 0A 54 68 65 20 70 72-6F 67 72 61 6D 20 63 6F ..The program co
13F4:0210 6D 70 61 72 69 6E 67 20-74 77 6F 20 6E 75 6D 62 mparing two numb
13F4:0220 65 72 73 24 0D 0A 49 6E-70 75 74 20 66 69 72 73 ers$..Input firs
13F4:0230 74 20 6E 75 6D 62 65 72-20 28 58 29 3A 20 24 0D t number (X): $.
13F4:0240 0A 49 6E 70 75 74 20 73-65 63 6F 6E 64 20 6E 75 .Input second nu
13F4:0250 6D 62 65 72 20 28 59 29-3A 20 24 0D 0A 58 3E 59 mber (Y): $..X>Y
13F4:0260 24 0D 0A 58 3C 59 24 00-00 00 00 00 00 00 00 00 $..X<Y$.........
13F4:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-e 267
13F4:0267 00.0d 00.0a
-e 269 "X=Y$"
-d 200
13F4:0200 0D 0A 54 68 65 20 70 72-6F 67 72 61 6D 20 63 6F ..The program co
13F4:0210 6D 70 61 72 69 6E 67 20-74 77 6F 20 6E 75 6D 62 mparing two numb
13F4:0220 65 72 73 24 0D 0A 49 6E-70 75 74 20 66 69 72 73 ers$..Input firs
13F4:0230 74 20 6E 75 6D 62 65 72-20 28 58 29 3A 20 24 0D t number (X): $.
13F4:0240 0A 49 6E 70 75 74 20 73-65 63 6F 6E 64 20 6E 75 .Input second nu
13F4:0250 6D 62 65 72 20 28 59 29-3A 20 24 0D 0A 58 3E 59 mber (Y): $..X>Y
13F4:0260 24 0D 0A 58 3C 59 24 0D-0A 58 3D 59 24 00 00 00 $..X<Y$..X=Y$...
13F4:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
Листинг программы:
Код
-a 100
13F4:0100 mov ah,09 ; подготавливаем функцию вывода строки «The...» на экран
13F4:0102 mov dx,200 ; в регистр DX вносим адрес первой выводимой строки
13F4:0105 int 21 ; вызываем прерывание DOS для вывода строки на экран
13F4:0107 mov dx,224 ; в DX вносим адрес строки «Input first number...»
13F4:010A int 21 ; вызываем прерывание DOS для вывода строки на экран
13F4:010C mov ah,01 ; подготавливаем функцию DOS для ввода символа
13F4:010E int 21 ; вызываем прерывание DOS для ввода символа с клавиатуры
13F4:0110 mov bx,ax ; копируем введенное число в регистр bx
13F4:0112 mov ah,09 ; подготавливаем функцию вывода строки на экран
13F4:0114 mov dx,23f ; в DX вносим адрес строки «Input second number...»
13F4:0117 int 21 ; вызываем прерывание DOS для вывода строки на экран
13F4:0119 mov ah,01 ; подготавливаем функцию DOS для ввода символа
13F4:011B int 21 ; вызываем прерывание DOS для ввода символа с клавиатуры
13F4:011D mov cx,ax ; копируем введенное число в регистр cx
13F4:011F mov ah,09 ; подготавливаем заранее функцию вывода строки на экран
13F4:0121 cmp bx,cx ; сравниваем введенные числа
13F4:0123 jg 0123 ; адрес перехода в случае, если bx>cx
13F4:0125 jl 0125 ; адрес перехода в случае, если bx<cx
13F4:0127 mov dx,267 ; в DX вносим адрес строки «X=Y»
13F4:012A int 21 ; вызываем прерывание DOS для вывода строки на экран
13F4:012C int 20 ; завершение программы
При вводе текста программы необходимо знать точные адреса переходов в случае выполнения логических условий. Для этого можно предварительно написать программу (например, на бумаге) и рассчитать адреса, в которых будут записаны команды с учетом их размера. Мы не стали вычислять адреса ячеек памяти, в которых буду находиться команды, и воспользовались
следующим трюком – указали в качестве адресов перехода адреса текущих ячеек памяти (выделены красным цветом в листинге выше). Далее пишем оставшуюся часть программы:
Код
13F4:012E mov dx,25b ; в DX вносим адрес строки «X>Y»
13F4:0131 int 21 ; вызываем прерывание DOS для вывода строки на экран
13F4:0133 int 20 ; завершение программы
13F4:0135 mov dx,261 ; в DX вносим адрес строки «X<Y»
13F4:0138 int 21 ; вызываем прерывание DOS для вывода строки на экран
13F4:013A int 20 ; завершение программы
Программа корректно работать не будет, поскольку мы не указали правильные адреса переходов. Эти адреса согласно логике программы нужно указать явно следующим образом (адреса ячеек для перехода выделены желтым цветом в листинге выше):
Код
-a 123
13F4:0123 jg 012e
13F4:0125 jl 0135
13F4:0127
Теперь мы написали программу и просмотрим ее полный текст:
Код
-u 100
13F4:0100 B409 MOV AH,09
13F4:0102 BA0002 MOV DX,0200
13F4:0105 CD21 INT 21
13F4:0107 BA2402 MOV DX,0224
13F4:010A CD21 INT 21
13F4:010C B401 MOV AH,01
13F4:010E CD21 INT 21
13F4:0110 89C3 MOV BX,AX
13F4:0112 B409 MOV AH,09
13F4:0114 BA3F02 MOV DX,023F
13F4:0117 CD21 INT 21
13F4:0119 B401 MOV AH,01
13F4:011B CD21 INT 21
13F4:011D 89C1 MOV CX,AX
13F4:011F B409 MOV AH,09
-u
13F4:0121 39CB CMP BX,CX
13F4:0123 7F09 JG 012E
13F4:0125 7C0E JL 0135
13F4:0127 BA6702 MOV DX,0267
13F4:012A CD21 INT 21
13F4:012C CD20 INT 20
13F4:012E BA5B02 MOV DX,025B
13F4:0131 CD21 INT 21
13F4:0133 CD20 INT 20
13F4:0135 BA6102 MOV DX,0261
13F4:0138 CD21 INT 21
13F4:013A CD20 INT 20
Запускаем программу на выполнение:
Код
-g
The program comparing two numbers
Input first number (X): 5
Input second number (Y): 6
X<Y
Программа завершилась нормально
Код
-g
The program comparing two numbers
Input first number (X): 6
Input second number (Y): 5
X>Y
Программа завершилась нормально
Код
-g
The program comparing two numbers
Input first number (X): 4
Input second number (Y): 4
X=Y
Программа завершилась нормально



Что за метка? Можете объяснить?
0
Эксперт Hardware
5349 / 1893 / 351
Регистрация: 29.07.2014
Сообщений: 2,823
Записей в блоге: 5
08.09.2016, 20:54 5
Цитата Сообщение от Vahram1995 Посмотреть сообщение
источник, третий пример
Код нужно сюда выкладывать в виде исходника. Кому нужно лазить по ссылкам?
В реальных программах метки заканчиваются двоеточием (exit: ), а у тебя отладчик, поэтому меткой будет просто адрес, по которому находится INT-20h:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
C:\>debug
-a
139D:0100  jmp  104              ; пропускаем секцию данных
139D:0102  db   77               ; данные..
139D:0103  db   8F               ; ^^
139D:0104  mov  al,[102]         ; AL = 77h
139D:0107  mov  bl,[103]         ; BL = 8Fh
139D:010B  cmp  al,bl            ; сравнить!
139D:010D  ja   119              ; переход на метку с INT-20h, если AL > BL
139D:010F  xor  bl,bl            ; иначе: BL = 0
139D:0111  mov  si,7e13          ; адрес источника = 7E13h
139D:0114  mov  di,300           ; адрес приёмника = 0300h
139D:0117  lodsb                 ; берём байт из SI
139D:0118  stosb                 ; вставляем его в DI
139D:0119  int  20               ; выход из программы! 0119h = метка для JA
139D:011B
-
1
1 / 1 / 1
Регистрация: 20.01.2013
Сообщений: 80
08.09.2016, 21:22  [ТС] 6
R71MT, дело в том что не пишут в dosbox int 20.
0
Эксперт Hardware
5349 / 1893 / 351
Регистрация: 29.07.2014
Сообщений: 2,823
Записей в блоге: 5
08.09.2016, 21:52 7
..так и ты не пиши, а указывай адрес последней команды в коде
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.09.2016, 21:52

void _fastcall TForm1::Vector(int x0, int y0, int a, int l);
//--------------------------------------------------------------------------- #include...

Dictionary<int,List<int>> и IReadOnlyDictionary<int,IReadOnlyList<int>>
Народ, столкнулся с такой ситуацией. Есть Переменная Dictionaty&lt;int,List&lt;int&gt;&gt; Dic = new...

[C++ Error] Unit1.cpp(50): E2316 '_fastcall TForm1::Vector(int,int,int,int)' is not a member of 'TForm1'
есть событие набраное в Unit.cpp, при запуске программы выбивается ошибка: Unit1.cpp(50): E2316...

Блин, для ЧЕГО НУЖНА Функция CREATE TABLE invoice( inv_id INT AUTO_INCREMENT NOT NULL , usr_id INT NOT NULL , prod_id INT NOT NULL , quantity INT NOT
Погуглив, так и не смог толком понять. Есть тут ГУРУ по mysql Которые могут на пальцах или на...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru