Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 24.10.2018
Сообщений: 16
1
MASM

Программа вызывающая другую программу (Требуется внедрить prompt, для запроса имени исполняемого файла "study.exe")

25.10.2018, 21:56. Показов 2443. Ответов 14

Author24 — интернет-сервис помощи студентам
Помогите разобраться, пожалуйста. Необходимо в коде добавить участок, который запросит дейтсвие: "Введите имя файла (study.exe):" И скажите, правильно ли я мыслю? Мы введем комманду для запроса действия от юзера, который должен ввести "study.exe" и данное значение оно сравнит с вшитым в программе, командой XOR я полагаю? Прилагаю код ниже:

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
        title study
sseg    segment stack
        db      256 dup (?)
sseg    ends
dseg    segment
file    db  'study.exe',0
param   dw  7 dup (0)
kss     dw  0
ksp     dw  0
dseg    ends
cseg    segment
        assume ss:sseg,cs:cseg,ds:dseg
_start: jmp main
main:   push ds
        xor  ax,ax
        push ax
        mov  ax,dseg
        mov  ds,ax
        mov  ax,zseg
        mov  bx,ax
        mov  ax,es
        sub  bx,ax
        mov  ah,4Ah
        int  21h
        mov  ax,seg param
        mov  es,ax
        mov  bs,offset param
        mov  kss,ss
        mov  ksp,sp
        mov  dx,offset file
        mov  ax,seg file
        mov  ds,ax
        mov  ah,4Bh
        mov  al,0
        int  21h
        mov  ax,dseg
        mov  ds,ax
        mov  ss,kss
        mov  sp,ksp
        mov  ax,4c00h
        int  21h
cseg    ends
zseg    segment
zseg    ends
        end     _start
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2018, 21:56
Ответы с готовыми решениями:

Как создать exe контейнер для исполняемого файла с ограничениями
Как создать exe контейнер для исполняемого файла с встроенной системой ограничений для...

Программа для сжатия исполняемого файла
Здравствуйте не подскажите программу для сжатия исполняемого файла или есть ли такая функция в VS...

Ищу программу для анализа исполняемого файла
Добрый день всем, пересмотрел везде где только можно, ищу программу которая анализирует и выдает...

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

Как внедрить dll в exe, чтобы для работы программы нужен был только exe файл
как внедрить dll ссылку в exe, чтобы для работы программы нужен был только exe файл? Выдает...

14
Модератор
Эксперт по электронике
8516 / 4370 / 1648
Регистрация: 01.02.2015
Сообщений: 13,577
Записей в блоге: 9
25.10.2018, 22:38 2
А зачем сравнивать?
Да и сравнивать строки можно цепочечными командами rep cmps
0
0 / 0 / 0
Регистрация: 24.10.2018
Сообщений: 16
26.10.2018, 09:50  [ТС] 3
Это я озвучиваю свое видение логики программы, алгоритма в целом, каким образом оно должно работать как интерпретатор введенной команды.
Но вопрос актуален - как ввести запрос ввода комманды "study.exe" пользователю, для запуска "study.exe" лежащего в одном каталоге с этой программой?
0
Модератор
Эксперт по электронике
8516 / 4370 / 1648
Регистрация: 01.02.2015
Сообщений: 13,577
Записей в блоге: 9
26.10.2018, 17:40 4
Вывод сообщения функцией ah=09h int 21h.
Ввод строки функцией ah=0Ah int 21h.

Описание http://www.codenet.ru/progr/dos/int_0026.php

Примеры - через одну тему в данном разделе - постоянно вводятся и выводятся строки.
0
Эксперт Hardware
Эксперт Hardware
6160 / 2397 / 398
Регистрация: 29.07.2014
Сообщений: 3,143
Записей в блоге: 4
26.10.2018, 22:01 5
Цитата Сообщение от Legionov Посмотреть сообщение
и данное значение оно сравнит с вшитым в программе, командой XOR я полагаю?
..тоже вариант, и вот его реализация на FASM'e
только тут не 'xor', а хэш-сумма:
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
;fasm-code
;--------------
org   100h
jmp   start
 
hash    dw  's'+'t'+'u'+'d'+'y'+'.'+'e'+'x'+'e'
fName   db  'study.exe',0      ;
len     =   ($-fName)-1        ; длина имени файла
prompt  db  'File name: $'     ; диалог..
ok      db  '  <-- OK!$'       ;
err     db  '  <-- ERROR!$'    ;
 
start:  mov   ah,9             ; запрос на ввод
        mov   dx,prompt        ;
        int   21h              ;
 
        mov   cx,len           ; счётчик цикла для LOOP
        xor   bx,bx            ; очистить место под хэш
@inp:   mov   ah,1             ; ввод символа с эхом
        int   21h              ;    ..(введённый символ в AL)
        and   ah,0             ; очистить AH
        add   bx,ax            ; считаем хэш в ВХ
        loop  @inp             ; промотать СХ-раз..
 
        mov   ah,9             ; функция вывода строки
        mov   dx,ok            ; что выводить
        cmp   bx,[hash]        ; сравнить хэш-сумму
        jz    @ok              ; если совпала..
        mov   dx,err           ; иначе: подменить мессагу
@ok:    int   21h              ; вывод ОК или ERROR!
 
;------ Здесь освобождай память(4Ah) и стартуй файл(4Bh)
;;;;;;;;
        mov   ah,8       ; ждём клавишу..
        int   21h
        ret              ; выход в DOS для *.СОМ-файлов!
2
0 / 0 / 0
Регистрация: 24.10.2018
Сообщений: 16
28.10.2018, 02:05  [ТС] 6
[Решено]
0
0 / 0 / 0
Регистрация: 24.10.2018
Сообщений: 16
28.10.2018, 02:17  [ТС] 7
Вопрос в следующем: В дата сегменте, как видно, я ввёл переменные для вывода текста приглашения и ввода, а также сигнала о ошибке, который будет использоваться в дальнейшем. Программа должна запросить у пользователя ввод "study.exe", записать введеное ним значение в пустую переменную, затем сравнить его оператором "repe cmps" (или возможно другим, подходящим, если такие есть) со строкой в переменной "file". При успехе и равности - перейти на метку ниже, для продолжения программы и вызова файла. При разности вводных данных - перевести на метку "dev" для вывода ошибки.
Проблема заключается в том, что независимо от вводимых данных, программа переводит на метку "dev". Подскажите пожалуйста, как тут быть? Заранее, огромное спасибо с:
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
        title study
 
sseg    segment stack
        db      256 dup (?)
sseg    ends
 
dseg    segment
prompt  db  'Enter "study.exe":  $'
intext  db  0dh, 0ah, 'Press any key: $'
buffer  label byte      
max     db  10      
len     db  0       
input   db  10 dup (0)
error   db  'Error$',0
file    db  'study.exe',0
param   dw  7 dup (0)
kss     dw  0
ksp     dw  0
dseg    ends
 
cseg    segment
        assume ss:sseg,cs:cseg,ds:dseg
_start: jmp main
main:
        mov  ax,dseg
        mov  ds,ax
        mov  ah,09h
        mov  dx,offset prompt
        int  21h
 
        lea dx,buffer
        mov ah,0ah
        int 21h
 
        cld
        mov  es,ax
        lea  si,file
        lea  di,input
        mov  cx,10
        repe cmpsb
        jle  _dev
_match:
        mov  ax,03
        int  10h
        push ds
        xor  ax,ax
        push ax
        mov  ax,dseg
        mov  ds,ax
        mov  ax,zseg
        mov  bx,ax
        mov  ax,es
        sub  bx,ax
        mov  ah,4Ah
        int  21h
        mov  ax,seg param
        mov  es,ax
        mov  bx,offset param
        mov  kss,ss
        mov  ksp,sp
        mov  dx,offset file
        mov  ax,seg file
        mov  ds,ax
        mov  ah,4Bh
        mov  al,0
        int  21h
        mov  ax,dseg
        mov  ds,ax
        mov  ss,kss
        mov  sp,ksp
_dev:   
        dec  si
        dec  di
        mov  ax,dseg
        mov  ds,ax
        mov  ah,09h
        mov  dx,offset error
        int  21h
        mov ah,0ah
        int 21h
exit:   
        mov  ax,4c00h
        int  21h
cseg    ends
 
zseg    segment
zseg    ends
 
        end     _start
0
Модератор
Эксперт по электронике
8516 / 4370 / 1648
Регистрация: 01.02.2015
Сообщений: 13,577
Записей в блоге: 9
28.10.2018, 19:21 8
К слову. А вы не подменяете задачу? Точно нужно дозволить "голосовать" пользователю за правильного "кандидата"?
Или задача была в написании двух программ, одна из которых должна просто запросить имя другой и запустить её. Причём это не обязательно должна быть именно "study.exe". Просто "study.exe" гарантированно есть в папке с этой программой (по требованию задания).

Добавлено через 3 минуты
Вы сравниваете 10 символов (строка 39), но длина строки "study.exe" всего 9 символов, а сколько ввёл пользователь на этапе компиляции неизвестно.
Сравнивайте строку на равенство начиная со сравнения длин, и при их равенстве переходите к сравнению содержимого.
0
0 / 0 / 0
Регистрация: 24.10.2018
Сообщений: 16
29.10.2018, 11:45  [ТС] 9
Со сравнение длин еще понятно, а как сравнить контент? Ключевой вопрос сейчас. А кроме этого момента, есть ли какие-то огрешности в программе? В логике\алгоритме например?
0
Модератор
Эксперт по электронике
8516 / 4370 / 1648
Регистрация: 01.02.2015
Сообщений: 13,577
Записей в блоге: 9
29.10.2018, 12:19 10
Сравнение строк одинаковой длины
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
mov cx, длина
lea si, первая строка
lea di, вторая строка
cld
push ds
pop es
repe    cmpsb
jnz     НеРавны
    тут действия при равенстве
    jmp Metka
НеРавны:
    тут действия при неравенстве
Metka:
0
0 / 0 / 0
Регистрация: 24.10.2018
Сообщений: 16
29.10.2018, 12:56  [ТС] 11
Спасибо большое! А ввод юзером с клавиатуры и запись в переменную реализована правильно в данном примере?
В переменную buffer записывается введенное значение через ф-цию "0aH". Я правильно функцию заполнил?
Assembler
1
lea dx,buffer
означает что данные будут именно туда помещены?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dseg    segment
 
buffer  label byte      
max     db  10      
len     db  0       
input   db  10 dup (0)
 
dseg    ends
 
cseg    segment
 
        lea dx,buffer
        mov ah,0ah
        int 21h
 
cseg    ends
0
Модератор
Эксперт по электронике
8516 / 4370 / 1648
Регистрация: 01.02.2015
Сообщений: 13,577
Записей в блоге: 9
29.10.2018, 13:23 12
В само поле input записывается max+1 символ (строка и дополнительный символ с кодом 13) - это особенность данной функции и она имеется в описании. Если при описании буфер сделать меньше, то сама функция отработает правильно и в предельном случае запишет 11 символов в input, но т.к. для input выделено всего 10 байт, то 11-й запишется в следующий за input байт и затрёт следующую за input переменную.
Если задаёте размеры магическими константами, то input db 11 dup (0)
0
0 / 0 / 0
Регистрация: 24.10.2018
Сообщений: 16
29.10.2018, 16:04  [ТС] 13
В итоге получился такой код. Но опять программа перепрыгивает на метку dev, игнорируя ввод с клавиатуры и прочие команды. Правильно ли я ввожу данные с клавиатуры в переменную?
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
        title study
 
sseg    segment stack
        db      256 dup (?)
sseg    ends
 
dseg    segment
prompt  db  'Enter "study.exe":  $'
buffer  db  10 dup (?)              ;Буффер для введенного значения      
input   dw  ?                       ;Переменная для записи из буффера
error   db  'Error$',0
testvar db  'study.exe$',0          ;Строка для сравнения введенного значения
file    db  'study.exe',0
param   dw  7 dup (0)
kss     dw  0
ksp     dw  0
dseg    ends
 
cseg    segment
        assume ss:sseg,cs:cseg,ds:dseg
_start: jmp main
main:
        mov  ax,dseg
        mov  ds,ax
        mov  ah,09h                 ;Приглашение для ввода.
        mov  dx,offset prompt
        int  21h
 
        mov ah,0ah                  ;Запрос на ввод с клавиатуры
        mov dx,offset buffer        ;Ввод с клавиатуры в буффер
        int 21h                     ;Вводим строку
        mov input,ax                ;Запись из АХ в переменную input
 
        mov cx,10                   ;Максимальное кол-во символов для ввода
        lea si,input                ;Строка введенная пользователем
        lea di,testvar              ;Строка в дата-сегменте
        cld                         
        push ds
        pop  es
        repe cmpsb
        jnz  _dev                   ;Переход на метку dev при неравности
;============================================================================
                            ;Выполняется при равности
                ;Функция вызова файла в одном корне с программой    
;============================================================================
            mov  ax,03
            int  10h
            push ds
            xor  ax,ax
            push ax
            mov  ax,dseg
            mov  ds,ax
            mov  ax,zseg
            mov  bx,ax
            mov  ax,es
            sub  bx,ax
            mov  ah,4Ah
            int  21h
            mov  ax,seg param
            mov  es,ax
            mov  bx,offset param
            mov  kss,ss
            mov  ksp,sp
            mov  dx,offset file
            mov  ax,seg file
            mov  ds,ax
            mov  ah,4Bh
            mov  al,0
            int  21h
            mov  ax,dseg
            mov  ds,ax
            mov  ss,kss
            mov  sp,ksp
;============================================================================
                                ;Конец функции  
;============================================================================
        jmp  _wait
_dev:                               ;Вывод ошибки при неравенстве
        mov  ax,03
        int  10h
        dec  si
        dec  di
        mov  ax,dseg
        mov  ds,ax
        mov  ah,09h
        mov  dx,offset error
        int  21h
        mov ah,0ah
        int 21h
_wait:                              ;Аналог паузы, для того чтоб увидеть результат без моментального выхода из программы
        mov  ax,03
        int  10h
        mov ah,0ah
        int 21h
exit:   
        mov  ax,4c00h
        int  21h
cseg    ends
 
zseg    segment
zseg    ends
 
        end     _start
0
Модератор
Эксперт по электронике
8516 / 4370 / 1648
Регистрация: 01.02.2015
Сообщений: 13,577
Записей в блоге: 9
29.10.2018, 21:04 14
Лучший ответ Сообщение было отмечено Legionov как решение

Решение

Вы неправильно вызываете чтение функцией 0Ah int 21h. Посмотрите примеры, как буфер организуется. В данном подразделе через одну тему - ввод строки с клавиатуры данной функцией.
Вдобавок, я уже давал именно вам ссылку на справочник по функциям int 21h.

В общем виде - вы даёте функции ссылку на область памяти, а функция сама её заполняет. Ничего в регистрах из неё не передаётся. И в регистре ax нет магического сохранения строки - Воланд не расширяет квартиру пятым измерением, регистр ax содержит всего 2 байта, а вы ожидаете строку на 9 байтов.
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
75
76
77
78
79
        title study
 
sseg    segment stack
        db      256 dup (?)
sseg    ends
 
dseg    segment
msgNoEqual      db      'No '
msgEqual        db      'Equal', '$'
msgCrLf         db      0Dh, 0Ah, '$'
 
prompt  db  'Enter "study.exe":  $'
buffer  label   byte
MaxLen  db      8+1+3+1         ;name+'.'+extention+(традиции функции 0Ah int 21)
Len     db      ?
input   db      10 dup (?)      ;Буфер для введенного значения
 
file    db  'study.exe',0
ReqLen  dw      $-file-1        ;длина имени файла без учёта завершающего нуля
dseg    ends
 
cseg    segment
        assume ss:sseg,cs:cseg,ds:dseg
_start: jmp main
main:
        mov  ax,dseg
        mov  ds,ax
 
        mov  ah,09h                 ;Приглашение для ввода.
        mov  dx,offset prompt
        int  21h
 
        mov ah,0ah                  ;Запрос на ввод с клавиатуры
        mov dx,offset buffer        ;Ввод с клавиатуры в буффер
        int 21h                     ;Вводим строку
 
        mov     ah,     09h
        lea     dx,     [msgCrLf]
        int     21h
        ;сравнение строк - введённой и эталонной
        ; - сравнение длин
        xor     cx,     cx
        mov     cl,     [Len]
        cmp     cx,     [ReqLen]
        jne     @@NoEqual
 
        ; - раз длины совпали, есть смысл проверить значение
        push    es
        mov     ax,     ds
        mov     es,     ax
        cld
        lea     si,     [input]
        lea     di,     [file]
        mov     cx,     [ReqLen]
        repe    cmpsb
        pop     es
        jnz     @@NoEqual
 
@@Equal:
        mov     ah,     09h
        lea     dx,     [msgEqual]
        int     21h
        jmp     @@Exit
@@NoEqual:
        mov     ah,     09h
        lea     dx,     [msgNoEqual]
        int     21h
@@Exit:
        mov     ah,     0
        int     16h
exit:
        mov  ax,4c00h
        int  21h
cseg    ends
 
zseg    segment
zseg    ends
 
        end     _start
1
0 / 0 / 0
Регистрация: 24.10.2018
Сообщений: 16
30.10.2018, 02:07  [ТС] 15
Большое спасибо, вопрос решен, пройдусь по коду еще раз и подучу матчасть с:
0
30.10.2018, 02:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2018, 02:07
Помогаю со студенческими работами здесь

API контроль процессов не зависимо от имени исполняемого файла.
Здравствуйте. Опишу ситуацию прежде чем спросить у местных гуру... Пишу небольшую несложную...

Создание исполняемого файла exe в QB
Записать в файл 2 произвольных числа и вывести файл-результат суммы и разности этих чисел. Создать...

Запуск исполняемого файла (.exe)
Hi every body! Помогите в разработке программы. Я не знаю какие нужно использовать функции в C++...

Напишите программу вывода на экран имени исполняемого модуля
Пример программы: // Программа заполняет массив однобайтовых целых чисел однобайтовыми //...

Внедрить программу в другую программу/игру
Написал маленькую прогу для игры которая нажимает пробел каждые пол секунды Сделал её по верх всех...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru