Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ассемблер _ Помогите доделать задачи

Автор: Гость_Дмитрий 23.08.2004 15:29

у меня MASM32 при компиляции ругается на
1) pascal, нужен сегмент и думаю, что не много не доделана.
надо записать в байт памяти 0 с логич. адрресом segm:ofs

Код

call zero pascal,0B800h,12h
. . .
zero proc pascal segm,ofs
uses ds,di
lds di,dword ptr ofs
mov byte ptr ds:[di],0
ret
zero endp

2) флаг ZF установить. задают пары DS:BX ES:DX
при компиляции ругается на недостаток сегмента и на  :blink: chkaddr
mov bx,0F000h
mov ds,bx
mov bx,0FFF0h
mov dx,0FFFFh
mov es,dx
xor dx,dx
call chkaddr

mov bx,dx
call chkaddr
. . .
chkaddr proc pascal
uses eax,ebx
mov ax,ds
movzx eax,ax
shl eax,4
movzx ebx,bx
add eax,ebx
mov bx,es
shl ebx,4
movzx edx,dx
add ebx,edx
cmp eax,ebx
ret
chkaddr endp

отредактировано МОДЕРАТОРОМ
просьба оформить тему правильно
--------
условия несколько сумбурны и непонятны
и сам заголовок темы

Автор: BlackShadow 23.08.2004 15:32

Оформи правильно, условия выложи полностью... Там и посмотрим.

Автор: Гость_Дмитрий 24.08.2004 12:18

изначально было нужно:
1 задача) запись нулевого значенияв байт памяти с адресом segm:offset(известны во время ассемблирования)
2-задача) флаг установить в состояние зависящееот регистров пары DS:BX ES:DX

Автор: Гость_Дмитрий 24.08.2004 12:28

Совсем забыл. Постоянно наступаю на грабли, что неправильно оформил.
Читал правила но не понял, что считать темой, а что пояснением.
Прошу на данном примере, если не затруднит, показать, как я должен был сделать. blink.gif

Автор: BlackShadow 25.08.2004 17:37

1)

PROC MakeNull PASCAL
 ARG @@LPTR:DWORD
 USES ES,DI

 LES DI,[@@LPTR]
 XOR AL,AL
 STOSB  ;или MOV [ES:DI],AL
 RET
ENDP MakeNull


2). По-прежнему ничего не понятно. Зависимости бывают разные (там алкогольные например...), так что поясни по-точнее.

Автор: Гость_Дмитрий 25.08.2004 18:53

ZF устанавливается в определённое состояние зависящее от того, задают регистровые пары DS:BX ES:DX один и тот же физический адрес или нет.


вопрос по первой задаче?
а логический адрес segm:offset не нужен? blink.gif

Автор: BlackShadow 25.08.2004 19:39

ответ по первой задаче: DWORD - 4 байта. Т. е. 2 слова. 2 слова это и есть сегмент и смещение. Делаешь что-то типа

PUSH SEG MyVar
PUSH OFFSET MyVar
CALL MakeNull


2).
XOR EAX,EAX
MOV AX,DS
SHL AX,4
SHL EBX,16
SHR EBX,16;Галимый способ обнулить верхнюю часть регистра, но думать я
                ;сейчас не в состоянии
ADD EAX,EBX
XOR ECX,ECX
MOV CX,DS
SHL ECX,4
SHL EDX,16
SHR EDX,16
ADD ECX,EDX
CMP EAX,ECX
Должно быть так. Если адреса не совпадают, то ZF сбросится, иначе установится. Вариант не из лучших, но должен работать...