Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.27;
Скачать: CL | DM;

Вниз

Assembler   Найти похожие ветки 

 
Хенд   (2005-03-09 21:06) [0]

Уже час ломаю голову. Есть строка:
msg db "Assembler"
Как в регистр AL записать пятую букву (m)?


 
wicked ©   (2005-03-09 21:08) [1]

mov al, byte ptr [msg + 4]


 
Хенд   (2005-03-09 21:16) [2]

Спасибо. Только это мне не очень помогло :)
Необходимо загрузить в AL букву, номер которой указан в CX.
Если написать просто
mov al, byte ptr [msg+cx-1]
то происходит ошибка Illegal indexing mode
Как можно реализовать?

P.S. Просьба строго не судить, так как изучаю ASM только второй день


 
Anton_K ©   (2005-03-09 21:23) [3]

Для 16-битного режима:

add cx,offset msg
mov al,byte ptr [cx]


 
Хенд   (2005-03-09 21:27) [4]

А если не изменяя CX? В моем случае код находится в цикле loop (cx используется в качестве счетчика)...


 
Anton_K ©   (2005-03-09 21:31) [5]

Полностью опиши, что ты хочешь сделать. Мне кажется, что тебе надо цепочные команды использовать.


 
begin...end ©   (2005-03-09 21:34) [6]

> Хенд   (09.03.05 21:27) [4]

mov si,cx
mov al,mes[si]


 
Хенд   (2005-03-09 21:36) [7]

Необходимо вывести строку двумя способами: напрямую в видеобуфер и через прерывание BIOS (при чем выводить сверху вниз). Пока пытаюсь реализовать через запись в видеобуфер...
СSEG Segment
assume CS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG
org 100h
Start:
len=9
call Video
call Bios
mov ah,10h
int 16h
int 20h

Video proc
mov ax,0B800h
mov es,ax
mov di,0
mov cx,len
l1:
mov ax,es:[di]
mov al, byte ptr [msg+len-cx]
and ah,11110000b
add ah,00001111b
mov es:[di],ax
add di,160
loop l1
ret
Video endp

Bios proc
ret
Bios endp

msg db "Assembler"

CSEG ends
end Start


 
Хенд   (2005-03-09 21:43) [8]

Посмотрите. Так должно работать правильно?

CSEG Segment
assume CS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG
org 100h
Start:
len=9
call Video
call Bios
mov ah,10h
int 16h
int 20h

Video proc
mov ax,0B800h
mov es,ax
mov di,0
mov cx,len
l1:
mov ax,es:[di]
mov si,len
sub si,cx
mov al,msg[si]

mov ah,31
;and ah,11110000b
;add ah,00000000b
mov es:[di],ax
add di,160
loop l1
ret
Video endp

Bios proc
ret
Bios endp

msg db "Assembler"

CSEG ends
end Start


 
Anton_K ©   (2005-03-09 21:43) [9]


Video proc
mov ax,0B800h
mov es,ax
mov di,0
mov si,offset msg
mov cx,len
cld
rep movsb
ret
Video endp


Вроде так...


 
Andy BitOff ©   (2005-03-09 21:44) [10]

При первом взгляде:

msg db "Assembler"
len equ $-msg


 
Хенд   (2005-03-09 22:01) [11]

Всем спасибо. Приведенный мною вариант с SI работает...
Для проверки приходится загружать DOS с дискеты, так как в XP вывод в видеобуфер не отображается, а установить DOS на жесткий диск нет возможности, так как файловая система NTFS... Вот и приходится каждый раз для проверки грузится в Win98StartDisk :)

Всё же не понятно, почему нельзя использовать CX напрямую, вместо SI...

2Andy BitOff
Спасибо. Сразу хотел так сделать, только не смог вспомнить :)


 
begin...end ©   (2005-03-09 22:19) [12]

> Хенд   (09.03.05 21:43) [8]

Если уж НЕ использовать цепочечные команды, то примите к сведению:

> mov cx,len
> l1:
> ...
> mov si,len
> sub si,cx
> mov al,msg[si]
> ...
> loop l1

   mov cx,len
   xor si,si
l1:
   ...
   mov al,msg[si]
   ...
   inc si
   loop l1


 
SammIk ©   (2005-03-09 22:38) [13]

mov cx,len
l1:
...
mov al,msg[cx]
...
loop l1


 
DrPass ©   (2005-03-10 00:47) [14]


> Хенд   (09.03.05 22:01) [11]
> Для проверки приходится загружать DOS с дискеты, так как
> в XP вывод в видеобуфер не отображается, а установить DOS
> на жесткий диск нет возможности, так как файловая система
> NTFS... Вот и приходится каждый раз для проверки грузится
> в Win98StartDisk :)

В оффтоп:
Скачай с сайта Microsoft полезную вещь - Virtual PC 2004. Незаменимый инструмент, если нужно писать что-то под другие ОС, а машина только одна.


 
Хенд   (2005-03-10 07:20) [15]

2SammIk
Так не работает. Проверил первым делом.
mov al,msg[cx]

2DrPass
Спасибо за наводку. Поищу.


 
Kerk ©   (2005-03-10 07:25) [16]


> mov al,msg[cx]

насколько я понимаю

mov al,[offset msg + cx]


 
Bless ©   (2005-03-10 09:46) [17]

Хенд  (09.03.05 22:01) [11]>
>Всё же не понятно, почему нельзя использовать CX напрямую, вместо
>SI...

Дело в том, что в реальном режиме процессора использовать в качестве индексных можно только регистры si, di, bx, bp, причем если используешь сразу два, то нельзя использовать пары si/di bx/bp. То есть
mov ax, msg[si][di] - нельзя
mov ax, msg[si][bx] - можно

В защищенном режиме можно использовать не только указанные 4 регистра, но вообще любые.

Пусть меня поправят знатоки асма, если где ошибся.


 
SammIk ©   (2005-03-10 11:15) [18]

Во про реальный режим не знаю
а про не реальный забыл поставить[ecx-1] тогда рыботать будет.
Но копить будет в обратном порядке. Может можно так[cx-1]


 
Хенд   (2005-03-10 23:00) [19]

А есть какой-нибудь краткий справочник по ассемблеру, содержащий основные функции различных прерываний, коды символов и т.д. и т.п. Чтобы не рыться в огромном кол-во учебников, а всегда иметь самое важное под рукой...


 
Andy BitOff ©   (2005-03-10 23:09) [20]

Вот одно из наиболее приятных вариянтов:
http://duncanmr.chat.ru/guide/start.htm



Страницы: 1 вся ветка

Текущий архив: 2005.03.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.043 c
6-1106561928
Redis
2005-01-24 13:18
2005.03.27
Программно отправить MMS через GPRS модем


3-1109840819
juice
2005-03-03 12:06
2005.03.27
DataSource


1-1110950725
SergP
2005-03-16 08:25
2005.03.27
Поиск подстроки в контенте принятом TClientSocket


6-1106827836
AlexG
2005-01-27 15:10
2005.03.27
Проблема с установкой callback-функции на функцию WinInet...


1-1110714640
Object
2005-03-13 14:50
2005.03.27
Куда прописать файлы *.dcr;*.dcu;*.hpp;*.obj...