K
karloson
Да, конечно для большинства это замученная тема, и не представляет интереса, но ведь форум для того и создан, чтобы люди могли что то спросить, а знающие могли помочь....
Ну вообщем сама задача: Нужно реализовать макрос деления на константу, и проверить - является ли константа степенью двойки, если является, то деление осуществить сдвигом (shr),если нет - DIV.
Здесь я описал - как я делил просто на двойку, но и тут не лады : когда я делю DIV (см МЕТКА 1) , затем вывожу число на экран, а затем смотрю флаг CF , чтобы посмотреть остаток - то всё ништяк, а когда я делаю сдвиг (МЕТКА 2), то остаток не выводится(т.е. всегда переходит на NOFLOAT. [Основной ворос про МАКРОС]
DATASEG
....
Buffer DB 10 Dup(0)
....
CODESEG
.....
Proc SetPosition
push dx
push ax
push cx
mov dl,bl
mov dh,bh
mov bh,0
mov ah,02h
int 10h
mov bh,dh
pop cx
pop ax
pop dx
ret
ENDP SetPosition
Proc ByteToScreen ; dl- input byte
push cx
push ax
Call SetPosition
Call ByteToCh
mov dx, offset Buffer
mov ah,09h
int 21h
pop ax
pop cx
ret
EndP ByteToScreen
start:
.......
add ax,bx
; mov bl,2
; div bl ; МЕТКА 1
shr ax,1; МЕТКА 2
push ax
push bx
mov bl,56 ;\
mov bh,9 ; \
mov dl,al ; /Вывожу число на экран
Call ByteToScreen;/
cmp ah,1
jne nofloat; ah<>1 jne cf=0
mov [Buffer+0],'.'
mov [Buffer+1],'5'
mov [Buffer+2],'$'
mov dx, offset Buffer
mov ah,09h
int 21h
nofloat:
......
end start
Ну вообщем сама задача: Нужно реализовать макрос деления на константу, и проверить - является ли константа степенью двойки, если является, то деление осуществить сдвигом (shr),если нет - DIV.
Здесь я описал - как я делил просто на двойку, но и тут не лады : когда я делю DIV (см МЕТКА 1) , затем вывожу число на экран, а затем смотрю флаг CF , чтобы посмотреть остаток - то всё ништяк, а когда я делаю сдвиг (МЕТКА 2), то остаток не выводится(т.е. всегда переходит на NOFLOAT. [Основной ворос про МАКРОС]
DATASEG
....
Buffer DB 10 Dup(0)
....
CODESEG
.....
Proc SetPosition
push dx
push ax
push cx
mov dl,bl
mov dh,bh
mov bh,0
mov ah,02h
int 10h
mov bh,dh
pop cx
pop ax
pop dx
ret
ENDP SetPosition
Proc ByteToScreen ; dl- input byte
push cx
push ax
Call SetPosition
Call ByteToCh
mov dx, offset Buffer
mov ah,09h
int 21h
pop ax
pop cx
ret
EndP ByteToScreen
start:
.......
add ax,bx
; mov bl,2
; div bl ; МЕТКА 1
shr ax,1; МЕТКА 2
push ax
push bx
mov bl,56 ;\
mov bh,9 ; \
mov dl,al ; /Вывожу число на экран
Call ByteToScreen;/
cmp ah,1
jne nofloat; ah<>1 jne cf=0
mov [Buffer+0],'.'
mov [Buffer+1],'5'
mov [Buffer+2],'$'
mov dx, offset Buffer
mov ah,09h
int 21h
nofloat:
......
end start