Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите доделать задачи
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
Гость_Дмитрий
у меня 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
Оформи правильно, условия выложи полностью... Там и посмотрим.
Гость_Дмитрий
изначально было нужно:
1 задача) запись нулевого значенияв байт памяти с адресом segm:offset(известны во время ассемблирования)
2-задача) флаг установить в состояние зависящееот регистров пары DS:BX ES:DX
Гость_Дмитрий
Совсем забыл. Постоянно наступаю на грабли, что неправильно оформил.
Читал правила но не понял, что считать темой, а что пояснением.
Прошу на данном примере, если не затруднит, показать, как я должен был сделать. blink.gif
BlackShadow
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). По-прежнему ничего не понятно. Зависимости бывают разные (там алкогольные например...), так что поясни по-точнее.
Гость_Дмитрий
ZF устанавливается в определённое состояние зависящее от того, задают регистровые пары DS:BX ES:DX один и тот же физический адрес или нет.


вопрос по первой задаче?
а логический адрес segm:offset не нужен? blink.gif
BlackShadow
ответ по первой задаче: 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 сбросится, иначе установится. Вариант не из лучших, но должен работать...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.