Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 13
1

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

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

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

Адрес среды окружения программы находится в префиксе программного сегмента (PSP – область, с которой загружается соответствующая программа) со смещением 2Ch. Сегментный адрес PSP находится в регистрах DS и ES при старте программы.
Структура среды окружения:
db строка_1,0
db строка_2,0
...
db строка_т,0,0,х,х
db строка_запуска_программы,0

1. Необходимо получить из PSP адрес окружения, по этому адресу в среде окружения найти строку, которая описывает путь запуска программы, выдать ее на экран и номер этой строки.
2. Выдать строку с номером N (см. вариант). (Если строки с заданным номером не существует, то выдать сообщение «Строка с номером N не найдена»).
3. Выдать все строки, содержащие символы (см. вариант), в формате:
Строка 5: содержимое_строки.
(Если строки с заданным символом не существует, то выдать сообщение «Строка, содержащая символ *** не найдена»).

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

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

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

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

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

9
Ушел с форума
Автор FAQ
13876 / 6913 / 783
Регистрация: 11.11.2010
Сообщений: 12,446
09.02.2014, 13:40 2
STRELOK1110,
ну а где твои попытки? используй отладчик....
0
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 13
09.02.2014, 14:35  [ТС] 3
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
5617 / 2595 / 350
Регистрация: 17.02.2013
Сообщений: 3,765
09.02.2014, 16:45 4
Сопоставь :
Цитата Сообщение от STRELOK1110 Посмотреть сообщение
Сегментный адрес PSP находится в регистрах DS и ES при старте программы.
Цитата Сообщение от STRELOK1110 Посмотреть сообщение
Assembler
1
mov di,[cs:2ch]
Только если ты создаешь COM-программу это несоответствие проканает.
1
Клюг
7661 / 3176 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
09.02.2014, 17:03 5
Лучший ответ Сообщение было отмечено 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  [ТС] 6
Большое спасибо всем за помощь, будем теперь разбираться
0
5617 / 2595 / 350
Регистрация: 17.02.2013
Сообщений: 3,765
10.02.2014, 00:17 7
>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  [ТС] 8
Цитата Сообщение от Charles Kludge Посмотреть сообщение
23|>> jz @F
Tasm ругается на эту строчку, мб в Masm'е написана программа эта?
0
Ушел с форума
Автор FAQ
13876 / 6913 / 783
Регистрация: 11.11.2010
Сообщений: 12,446
18.02.2014, 15:30 9
STRELOK1110,
замени @@ и @f на @0
1
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 13
18.02.2014, 16:55  [ТС] 10
Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2014, 16:55

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

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

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

Как получить значения всех доступных переменных окружения
Вопрос глупый - как мне на моей ASP-страничке получить значения всех доступных переменных окружения.

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.