Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > помогите понять где ошибка


Автор: Dreamuchiy 4.11.2008, 21:54
TASM выдает ошибку : Operand types do not match в строке 10 и 11 вот прога:[code=asm]
Код

.386
.modell small
stack 100h
.DATA
buffer1 DB 255 DUP (255)
buffer2 DB 255 DUP (32)
.CODE
main PROC
CLD
MOV SI,buffer1
MOV DI,buffer2
MOV CX,255
REP MOVSB
MOV AX,4C00h
INT 21h
main ENDP
END main


Собственно я хотел посмотреть как работает команда MOVESB, впринципе ошибок на мой взгляв нет но вот TASM не принимает. Помогите разобраться  что там у меня с SI и DI не в порядке

Автор: Akina 4.11.2008, 22:40
Код

MOV SI, offset buffer1


Добавлено через 1 минуту и 9 секунд
Цитата(Dreamuchiy @  4.11.2008,  22:54 Найти цитируемый пост)
хотел посмотреть как работает команда MOVESB

Не посмотришь. DS/ES у тебя показывают отнюдь не на сегмент данных

Автор: Dreamuchiy 5.11.2008, 00:39
А я писал OFFSET Мне он тоже ошибку выдавал, хотя может у меня там тогда тоже что то не правильно было. Если не сложно напишите как правильно указать на сегменты. ОТ создания блока данных до присваивания адреса регистрам

Автор: Mikl_ 5.11.2008, 05:17
Dreamuchiy, movsb копирование ds:[si] в es:[di] с инкрементом si и di. для модели small необходимо es спозиционировать на сегмент .data проще разобраться с movs используя такой код
Код
.286
.model tiny
org 100h
.CODE
start: CLD
MOV SI,offset buffer1
MOV DI,offset buffer2
MOV CX,255
REP MOVSB
retn
buffer1 DB 255 DUP (255)
buffer2 DB 255 DUP (32)
end start
 smile 

Автор: Akina 5.11.2008, 09:07
Цитата(Dreamuchiy @  5.11.2008,  01:39 Найти цитируемый пост)
как правильно указать на сегменты

Код

.8086
.modell small
stack 100h
.DATA
buffer1 DB 255 DUP (255)
buffer2 DB 255 DUP (32)
.CODE
main PROC
mov ax,data
mov ds,ax
mov es,ax
CLD
MOV SI,offset buffer1
MOV DI,offset buffer2
MOV CX,255
int 3
REP MOVSB
int 3
MOV AX,4C00h
INT 21h
main ENDP
END main

Добавлен код присвоения необходимых значений сегментным регистрам и отладочные прерывания, необходимые для того, чтобы увидеть результат.
Также заменена инструкция набора команд - всегда используйте самую младшую из возможных.

Автор: Mikl_ 5.11.2008, 10:12
Akina, в случае masm/tasm должно быть либо LEA ESI,BUFFER1 либо MOV SI,OFFSET BUFFER1 
если у нас fasm, nasm, yasm: тогда MOV SI,BUFFER1 но BUFFER1: TIMES 255 DB 255 smile 

Автор: Akina 5.11.2008, 11:04
Цитата(Mikl_ @  5.11.2008,  11:12 Найти цитируемый пост)
 в случае mas/tasm должно быть либо lea esi,buffer1 либо MOV SI,offset buffer1 

Да, поправил... 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)