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

Получить из PSP адрес окружения

09.02.2014, 13:10. Показов 5125. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, прошу помощи в реализации следующей программы на Асме(Tasm).

Адрес среды окружения программы находится в префиксе программного сегмента (PSP – область, с которой загружается соответствующая программа) со смещением 2Ch. Сегментный адрес PSP находится в регистрах DS и ES при старте программы.
Структура среды окружения:
Assembler
1
2
3
4
5
db  строка_1,0
db  строка_2,0
...
db  строка_т,0,0,х,х
db  строка_запуска_программы,0
1. Необходимо получить из PSP адрес окружения, по этому адресу в среде окружения найти строку, которая описывает путь запуска программы, выдать ее на экран и номер этой строки.
2. Выдать строку с номером N (см. вариант). (Если строки с заданным номером не существует, то выдать сообщение «Строка с номером N не найдена»).
3. Выдать все строки, содержащие символы (см. вариант), в формате:
Строка 5: содержимое_строки.
(Если строки с заданным символом не существует, то выдать сообщение «Строка, содержащая символ *** не найдена»).

Номер строки: 5, 79
Символ: @
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.02.2014, 13:10
Ответы с готовыми решениями:

Визуализация структуры PSP и блока параметров окружения программы
Эсть задание: Визуализация структуры PSP и блоку параметров окружения программы. Вот нашел программу: .8086 .model small ...

получение окружения из psp
Добрый день, насколько я знаю, что с помощью ассемблера я могу из psp получить служебную информацию о программе, но как это сделать с...

Как узнать 16-ричный адрес переменной окружения
Привет всем! Ребят, подскажите пожалуйста, какими способами можно узнать шестнадцатеричные адреса переменных окружения?

9
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
09.02.2014, 13:40
STRELOK1110,
ну а где твои попытки? используй отладчик....
0
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 13
09.02.2014, 14:35  [ТС]
Mikl___, мои попытки были тщетны...
я сейчас пытаюсь сделать Преобразование из шестнадцатеричного в двоичное...
Не поможет ни кто, ну ничего, буду сам делать

Добавлено через 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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
mov di,[cs:2ch]
mov es,di
xor di,di;es:di=адрес переменных окружения из PSP[2ch]
;ищем 2 нуля - т.к. строка запуска программы за ними
xor si,si;si=номер строки, строки нумеруются от 0
xor cx,cx
dec cx
mov al,0
findnext:
inc si;увеличим номер строки
repne scasb;ищем ноль в конце
cmp es:di,al
jne findnext
;нашли 2 нуля, пропскаем 2 цифры (xx,0)
add di,2
;теперь в es:di - адрес строки, в si - ее номер
call printnum
call printasciiz
ret
printasciiz proc;печать строки, оканчивающейся на 0
push ds
push es
push di
pop si
pop ds
jmp nxtchar
addchar:
int 29h
nxtchar:
lodsb
cmp al,0
jne addchar
pop ds
ret
endp
printnum proc;печать двухзначного номера в SI
mov al,13
int 29h
int al,10
int 29h
mov ax,si
mov dl,10
div dl
add ax,3030h
int 29h
mov al,ah
int 29h
mov al,' '
int 29h
ret
endp
;проверяется si на равенство искомой строки
;xor di,di;es:di=адрес переменных окружения из PSP[2ch]
;ищем 2 нуля - т.к. строка запуска программы за ними
xor si,si;si=номер строки, строки нумеруются от 0
xor cx,cx
dec cx
mov al,0
findnext:
cmp si,5;ищется 5-я строка:
jne findend
call printasciiz
jmp nxt1
findend:
inc si;увеличим номер строки
repne scasb;ищем ноль в конце
cmp es:di,al
jne findnext
nxt1:
;нашли 2 нуля, конец поиска, печатаем "строка не найдена"
;3. каждую строку еще и проверяешь на присутствие в нем '@'
xor di,di;es:di=адрес переменных окружения из PSP[2ch]
xor bx,bx;адрес текущего символа
xor si,si;si - номер страницы
tst:
mov ax,[es:bx]
inc bx
cmp ax,0;встретились 2 нуля?
je seed
cmp al,0;началась новая строка?
jne nxtchar
mov di,bx;в di-начало строки
inc si;номер строки
nxtchar:
cmp al,'7'
jne tst
call printnum
push si
call printasciiz
pop si
jmp tst
seed:
Добавлено через 21 минуту
Доработал немного код, исправил ошибки, которые увидел, или которые знал...
Все таки нужна помощь:
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
mov di,[cs:2ch]
mov es,di
xor di,di
xor si,si
xor cx,cx
dec cx
mov al,0
findnext:
inc si
repne scasb
cmp es:[di],al
jne findnext
add di,3
call printnum
call printasciiz
ret
printasciiz proc
push ds
push es
push di
pop si
pop ds
jmp nxtchar
addchar:
int 29h
nxtchar:
lodsb
cmp al,0
jne addchar
pop ds
ret
endp
printnum proc
mov al,13
int 29h
int al,10
int 29h
mov ax,si
mov dl,10
div dl
add ax,3030h
int 29h
mov al,ah
int 29h
mov al,' '
int 29h
ret
endp
xor si,si
xor cx,cx
dec cx
mov al,0
findnext:
cmp si,5
jne findend
call printasciiz
jmp nxt1
findend2:
inc si
repne scasb
cmp es:[di],al
jne findnext2
nxt1:
xor di,di
xor bx,bx
xor si,si
tst:
mov ax, es:[bx]
inc bx
cmp ax,0
je seed
cmp al,0
jne nxtchar2
mov di,bx
inc si
nxtchar2:
cmp al,'7'
jne tst
call printnum
push si
call printasciiz
pop si
jmp tst
seed:
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
09.02.2014, 16:45
Сопоставь :
Цитата Сообщение от STRELOK1110 Посмотреть сообщение
Сегментный адрес PSP находится в регистрах DS и ES при старте программы.
Цитата Сообщение от STRELOK1110 Посмотреть сообщение
Assembler
1
mov di,[cs:2ch]
Только если ты создаешь COM-программу это несоответствие проканает.
1
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
09.02.2014, 17:03
Лучший ответ Сообщение было отмечено STRELOK1110 как решение

Решение

STRELOK1110, кмк, всё гораздо проще:
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
;dumps environment
PSP_Env =   2Ch     ; смещение до сегмента окружения(environment)
 
    org 100h
start:  mov     ax, word [cs:PSP_Env]
    mov     ds,ax
    xor     si,si
    mov dx,si
_loop:  call    prfx
    call    cputs
nxt:    inc dx ; счетчик строк++
    cmp byte [si+1],0
    jnz _loop
;выводим путь, откуда запущена прога
    lodsw
_l1:    mov cx, ax
        call    cputs
        loop    _l1
        ret
; выводим ASCIZ-строку
cputs:  lodsb
    or  al,al
    jz  @F
    int 29h
    jmp cputs
@@: ret
; выводим префикс строки
prfx:   mov ax, 0D0Ah   ; новая строка - CR/LF
    call    cputw
; выводим номер строки
    mov ax, dx
    aam
    xchg    ah, al
    or  ax, '00'
    call    cputw
; выводим пробел и двоеточие
    mov ax,' :'
; выводит 2 байта из AX
cputw:  int 29h
    xchg    ah, al
    int 29h
    ret
1
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 13
09.02.2014, 18:14  [ТС]
Большое спасибо всем за помощь, будем теперь разбираться
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
10.02.2014, 00:17
>start: mov ax, word [cs:PSP_Env]
Префикс переназначения сегмента здесь и лишний и не логичный.
start: mov ax, word [ds:PSP_Env]
Так более методично.
0
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 13
18.02.2014, 15:14  [ТС]
Цитата Сообщение от Charles Kludge Посмотреть сообщение
23|>> jz @F
Tasm ругается на эту строчку, мб в Masm'е написана программа эта?
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
18.02.2014, 15:30
STRELOK1110,
замени @@ и @f на @0
1
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 13
18.02.2014, 16:55  [ТС]
Цитата Сообщение от Mikl___ Посмотреть сообщение
STRELOK1110,
замени @@ и @f на @0
спасибо, пробую

Добавлено через 5 минут
Цитата Сообщение от Charles Kludge Посмотреть сообщение
start: mov ax, word [cs:PSP_Env]
эм, теперь на сам сегмент жалуется...

Добавлено через 1 час 1 минуту
Вот по правленый код, но и в нем существуют ошибки, по крайней мере у меня (Tasm).
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
span class="kw4"> model tiny
.386
.code
;dumps environment
PSP_Env =   2Ch     ; смещение до сегмента окружения(environment)
 
    org 100h
start:  mov     ax, word [cs:PSP_Env]
    mov     ds,ax
    xor     si,si
    mov dx,si
_loop:  call    prfx
    call    cputs
nxt:    inc dx
    cmp byte ptr [si+1],0
    jnz _loop
;выводим путь, откуда запущена прога
    lodsw
_l1:    movzx   cx, ah
        call    cputs
        loop    _l1
        ret
; выводим ASCIZ-строку
cputs:  lodsb
    or  al,al
    jz  @F
    int 29h
    jmp cputs
@F: ret
; выводим префикс строки
prfx:   mov ax, 0D0Ah   ; новая строка - CR/LF
    call    cputw
; выводим номер строки
    mov ax, dx
    aam
    xchg    ah, al
    or  ax, '00'
    call    cputw
; выводим пробел и двоеточие
    mov ax,' :'
; выводит 2 байта из AX
cputw:  int 29h
    xchg    ah, al
    int 29h
    ret
    end     start
Ошибки:
(1) Illegal instruction
(3) Model must be specified first
(8) Code or data emission to undeclared segment
(9) Code or data emission to undeclared segment
(10) Code or data emission to undeclared segment
(11) Code or data emission to undeclared segment
(12) Undefined symbol: PRFX
(13) Undefined symbol: CPUTS
(14) Code or data emission to undeclared segment
(15) Code or data emission to undeclared segment
(16) Undefined symbol: _LOOP
(18) Code or data emission to undeclared segment
(19) Code or data emission to undeclared segment
(20) Undefined symbol: CPUTS
(21) Undefined symbol: _L1
(22) Code or data emission to undeclared segment
(24) Code or data emission to undeclared segment
(25) Code or data emission to undeclared segment
(26) Undefined symbol: @F
(27) Code or data emission to undeclared segment
(28) Undefined symbol: CPUTS
(29) Code or data emission to undeclared segment
(31) Code or data emission to undeclared segment
(32) Undefined symbol: CPUTW
(34) Code or data emission to undeclared segment
(35) Code or data emission to undeclared segment
(36) Code or data emission to undeclared segment
(37) Code or data emission to undeclared segment
(38) Undefined symbol: CPUTW
(40) Code or data emission to undeclared segment
(42) Code or data emission to undeclared segment
(43) Code or data emission to undeclared segment
(44) Code or data emission to undeclared segment
(45) Code or data emission to undeclared segment
(46) Undefined symbol: START

Добавлено через 16 минут
Цитата Сообщение от STRELOK1110 Посмотреть сообщение
span class="kw4">
Убрав эту строку, программа работает.
Но не известно когда она остановится)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.02.2014, 16:55
Помогаю со студенческими работами здесь

Как не указывать в правилах конкретный адрес, а взять из переменной окружения?
Такой код с конкретным адресом test1.ru работает (показывает мою картинку на моём сайте): RewriteEngine On RewriteCond...

Получить root на PSP 3527 DUO
ПОМОГИТЕ ПОЛУЧИТЬ РУТ НА PSP 3527 DUO ПЕРЕПРОБЫВАЛ КУЧУ ВСЕГО ПОД РУКОЙ ЕСЛИ ЧТО ЕСТЬ НОУТ

Получить адрес ИЗ указателя на адрес другой программы
В программе для редактирования RAM памяти процессов (в основном игровых =) ) ArtMoney можно получить из указателя №1 + число №2 на адрес №3...

Получить значение системной переменной окружения TEMP
в недрах Windows существуют две переменные окружения с именем ТЕМP: 1) пользовательская, значение по умолчанию устанавливается в...

Работа с GetEnvironmentStrings: как получить список переменных окружения
Добрый день. У меня следующий вопрос: как в C# работать с функцией GetEnvironmentStrings? Мои корявые руки заставляют возвращать какие-то...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru