Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2012, 15:05   #1
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию Новичковый вопрос, обращение к памяти

в сегменте данных объявлена string:
Код:
string	        DB	80 DUP(?)
теперь в коде [string+bx] работает
[string+si] работает
[string+dx] не работает
в чем разница между регистрами? и какие еще можно использовать для индексирования?

вот сам код программы которую реализую:
Код:
;1) Ввести строку из произвольных ASCII-символов и произвести её сортировку под управлением функциональных клавиш: 
;<F1> – по возрастанию; 
;<F2> – по убыванию; 
;<F10> – завершение программы. 
;Работу программы отобразить на экране

                       %TITLE "HELLO.ASM"
                        IDEAL
                        MODEL small
                        STACK 256
                        DATASEG
password	DB	'mole'                                 	; Пароль
string	        DB	80 DUP(?)	                        ; Буфер для ввода пароля
promt	        DB	13,10,'Enter pass: $'
OK	                DB	13,10,'Correct$'
newmass	DB 80 DUP(?)
promt2		DB 13,10,'Work$'
pass_len = 4                                                        ; Длина пароля

fff                    DB 13,10,'Enter string$'
	              CODESEG
start:	      mov ax,@data
                      mov ds,ax
begin:	      mov dx,offset promt	                 ; Адрес запроса
                      mov ah,09h	                                 ;Вывод запроса на ввод пароля
                      int 21h
;Введём пароль
                     mov bx,0	                                         ;Инициализация индексирования ввода
pass:	     mov ah,08h	                                 ;Функция ввода символа в AL без эха
                     int 21h
                     cmp al,13	                                 ;<Enter> ?
                     je compare	                                 ;Да, на сравнение
                     mov [string+bx],al                       	 ;Нет, сохраним символ
                     mov dl,'*'                                 	 ;Запишем на экран *
                     mov ah,02
                     int 21h
                     inc bx	                                         ;Фактически введено
                     jmp pass	                                         ;Повторять


;Сравнение введённого пароля с действительным (сравнение строк)
compare:	Cmp bx,pass_len
	Jne begin	;выйдем, если число введённых символов “> или <” 
	push ds	;Установить ES на сегмент данных
pop es	;es=ds
mov di,offset string	;ES:DI- начало string
mov si,offset password	;DS:SI- начало password
cld	;DF=0- просмотр вперёд
mov cx,pass_len	;Установить счётчик сравнения
repe	cmpsb	;{ds:si - es:di}. Сравнивать, пока символы двух 
		;строк совпадают, но не более CX раз)
jne begin	;Строки не равны
;Вывод сообщения ОК, подтверждающего правильность пароля
mov ah,09h	;Строки равны
mov dx,offset OK
int 21h
;продолжение программы
mov ah,09h
mov dx,offset fff
int 21h
mov ah,02
mov dl,13
int 21h
mov dl,10
int 21h
mov bx,0;
jmp Mass
Mass:    mov ah,01h
		int 21h
		cmp al,13
		je Enter0
		mov [string+bx],al
		inc bx
		jmp Mass
Enter0:  mov ah,02
		mov dl,13
		int 21h
		mov dl,10
		int 21h
		mov [string+bx],00h
		jmp oBegin
oBegin:   mov ah,01h
		int 21h
		cmp al,61h
		je F1
		jne exit
F1:		mov bx,0
		mov si,0
		jmp BSort
BSort:	cmp [string+bx],00h
		je endF1
		mov al,[string+bx]
		mov si,bx
		jmp searchmin
searchmin:
		inc si
		cmp si,00h
		je putmin 
		cmp al,[string+si]
		jg switch0
		jmp searchmin
		
switch0:	mov al,[string+si]
		mov dx,si
		jmp searchmin

putmin:	mov al,[string+bx]
		mov ah,[string+si]
		mov [string+si],al
		mov [string+bx],ah
		inc bx
		mov si,bx
		jmp BSort

endF1:	mov bx,0
		jmp output
output:	mov ah,02
		mov dl,[string+bx]
		int 21h
		inc bx
		cmp bx,00h
		je oBegin
		jmp output

exit:              mov ax,4C00h	                          ;Ввод функции 4С для завершения программы
                      int 21h
END  start
pinkiller вне форума Ответить с цитированием
Старый 20.03.2012, 15:14   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Цитата:
теперь в коде [string+bx] работает
[string+si] работает
[string+dx] не работает
в чем разница между регистрами? и какие еще можно использовать для индексирования?
В DOS'е регистры BP, BX, SI, DI
возможны комбинации
1) [BP]
2) [BX]
3) [DI]
4) [SI]
5) [BP+смещение]
6) [BX+смещение]
7) [DI+смещение]
8) [SI+смещение]
9) [BP+SI]
10) [BP+DI]
11) [BP+SI+смещение]
12) [BP+DI+смещение]
13) [BX+SI]
14) [BX+DI]
15) [BX+SI+смещение]
16) [BX+DI+смещение]
другие комбинации запрещены
Mikl___ вне форума Ответить с цитированием
Старый 20.03.2012, 15:16   #3
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию

DI и DX как нибудь связаны?
pinkiller вне форума Ответить с цитированием
Старый 20.03.2012, 15:19   #4
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Сообщение от pinkiller Посмотреть сообщение
DI и DX как нибудь связаны?
Для адресации к памяти совместно не используются. В некоторых прерываниях dx используется для передачи смещения на ячейку.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 20.03.2012, 15:20   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

pinkiller
Шутишь? Конечно связаны, у них первая буква совпадает , учебник найди и читай
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с взаимодействием динамической и статической памяти - обращение к статической переменной Comst95 Паскаль, Turbo Pascal, PascalABC.NET 1 03.01.2012 18:46
FillChar - обращение к несуществующему сектору памяти Эллурн Общие вопросы Delphi 4 17.01.2011 03:52
Обращение к ячейкам памяти HDD, чтение и запись Silver-nic Win Api 8 08.09.2009 16:51
Вопрос по поводу памяти! Slava12345 Компьютерное железо 13 04.07.2009 16:59
Вопрос выделением памяти Tiro Общие вопросы C/C++ 5 13.06.2009 16:46