посмотрте код
Модератор: Andy
написать программу,использующую процедуру вычисления двоичного представления числа S=0+1/5^1+1/5^2+1/5^3+...+1/5^N (n=8,10,20)
в вычисленияхудерживать 200 двоичных цифр.вывести на печаит первые 100 двоичных цифр.для организации вывода символов двоичных цифр использовать сдвиги бит
model tiny
masm
.386
.code
assume cs:@code,ds:@code,es:@code,ss:@code
org 100h
begin:
s db 42 dup(?) ;результат
ln_s=$-s
a db 42 dup(?) ;определение 2 массива
b db 42 dup(?) ;определение 1 массива
mov cl,42
mov si,offset s ; результат
mov di,offset a ; 2 массив
mov bx,offset b ; 1 массив
long dd 1 ;делимое
mov dx,word ptr long ; dx=0001h, старшая часть
; делимого
; ax=0000h , младшая часть
; делимого
xor ax,ax;
mov bl,5 ; делитель
push ds
pop es
divide:
div bl ;s=s/n
mov [si],al ;s---->()()()()
inc si
xor al,al
loop divide
tell:
cld ;s1=s
mov si,offset s ;
mov di,offset a ;
push di
mov cx,42 ;
rep movsb ;end s1=s
pop si
xor ah,ah
double:
push cx
mov al,[si] ; s1:=s1\n
div bl ; или bx
mov [si],ax
inc si
pop cx
loop double
dec si
mov di,offset s
add di,ln_s-1
clc
summ:
push cx
mov al,[di] ;сложение [di]+[si]
adc al,[si]
mov [si],al
dec si
dec di
pop cx
loop summ
pop cx
loop tell
end begin
народ подскажите как осуществить вывод ?
в вычисленияхудерживать 200 двоичных цифр.вывести на печаит первые 100 двоичных цифр.для организации вывода символов двоичных цифр использовать сдвиги бит
model tiny
masm
.386
.code
assume cs:@code,ds:@code,es:@code,ss:@code
org 100h
begin:
s db 42 dup(?) ;результат
ln_s=$-s
a db 42 dup(?) ;определение 2 массива
b db 42 dup(?) ;определение 1 массива
mov cl,42
mov si,offset s ; результат
mov di,offset a ; 2 массив
mov bx,offset b ; 1 массив
long dd 1 ;делимое
mov dx,word ptr long ; dx=0001h, старшая часть
; делимого
; ax=0000h , младшая часть
; делимого
xor ax,ax;
mov bl,5 ; делитель
push ds
pop es
divide:
div bl ;s=s/n
mov [si],al ;s---->()()()()
inc si
xor al,al
loop divide
tell:
cld ;s1=s
mov si,offset s ;
mov di,offset a ;
push di
mov cx,42 ;
rep movsb ;end s1=s
pop si
xor ah,ah
double:
push cx
mov al,[si] ; s1:=s1\n
div bl ; или bx
mov [si],ax
inc si
pop cx
loop double
dec si
mov di,offset s
add di,ln_s-1
clc
summ:
push cx
mov al,[di] ;сложение [di]+[si]
adc al,[si]
mov [si],al
dec si
dec di
pop cx
loop summ
pop cx
loop tell
end begin
народ подскажите как осуществить вывод ?
Почему ты думаешь что это будет работать? Ты делишь 16 разрядов в AX на 8 разрядов в BL" писал(а):xor ax,ax;
mov bl,5 ; делитель
push ds
pop es
divide:
div bl ;s=s/n
И к тому же не вижу смысла в этом цикле, потому как массив заполняется нулями
А ты уверен, что в CH будет 0, у тебя же цикл на CX построен." писал(а):mov cl,42
А в CX-то у нас что? Правильно - 0, так как перед ним был REP MOVSB" писал(а):double:
push cx
mov al,[si] ; s1:=s1\n
div bl ; или bx
mov [si],ax
inc si
pop cx
loop double
Зачем писать AX в [SI] если потом идет inc si
Может и в этом смысл есть, только вот команды DEC изменяют флаг CF." писал(а):push cx
mov al,[di] ;сложение [di]+[si]
adc al,[si]
mov [si],al
dec si
dec di
pop cx
Дельный совет тебе дам, сделай рабочий код - а на экран вывести - это уже самое последнее дело.
Почему ты думаешь что это будет работать? Ты делишь 16 разрядов в Ax на 8 разрядов в Bl
а как еще то, делитель в 2 раза больше делителя(или я не прав?)
а как еще то, делитель в 2 раза больше делителя(или я не прав?)
Тогда зачем писать про DX и AX - ты же вроде эту пару хотел поделить? А у тебя делится AX на BL - то есть 0 на 5 - результат - 0, остаток 0 - какой смысл-то?" писал(а):mov dx,word ptr long ; dx=0001h, старшая часть
; делимого
; ax=0000h , младшая часть
; делимого
xor ax,ax;
mov bl,5 ; делитель
Мне препод сказал так,я сначала вот так сделал
mov dx,word ptr long+2; dx=0001h, старшая часть
; делимого
mov ax,word ptr long ; ax=0001h , младшая часть
подскажи как надо.....
mov dx,word ptr long+2; dx=0001h, старшая часть
; делимого
mov ax,word ptr long ; ax=0001h , младшая часть
подскажи как надо.....
Да я бы сказал, только вот что измениться - я лично не могу понять, что происходит. Какова идея-то?
а посмотри я на паскале как эту задачу решил
тут также
тут также
Старался писать простым языком не используя сложные конструкции, переведено на ассемблер с http://forum.developing.ru/showthread.php?t=7018.
Код: Выделить всё
jmp @start
a dw 200 dup (0)
b dw 200 dup (0)
c dw 200 dup (0)
w db 200 dup (0)
p dw 30
const_10 dw 10
n dw 5
f dw 0
m db 0
k dw 0
x dw 0
@start:
push cs
push cs
pop ds
pop es
mov m, 8
call Perevod
mov m, 10
call Perevod
mov m, 20
call Perevod
mov ax, 4C00h
int 21h
Perevod proc near
mov si, offset a
mov di, offset c
mov k, 10
mov ax, k
xor dx, dx
div n
mov word ptr [si], ax
mov word ptr [di], dx
mov cx, p
dec cx
add si, 2
add di, 2
@division_1:
mov ax, [di-2]
mul const_10
div n
mov [si], ax
mov [di], dx
add si, 2
add di, 2
loop @division_1
mov cx, p
mov si, offset c
mov di, offset a
@summ_1:
mov ax, [di]
add [si], ax
add si, 2
add di, 2
loop @summ_1
;---------------------------
mov cx, m
dec cx
@division_2:
push cx
mov cx, p
cld
mov si, offset a
mov di, offset b
rep movsw
mov cx, p
mov si, offset b
@division_3:
mov ax, x
mul const_10
add ax, [si]
div n
mov [si], ax
mov x, dx
add si, 2
loop @division_3
mov cx, p
mov si, offset b
mov di, offset c
@summ_1:
mov ax, [si]
add [di], ax
mov ax, [di]
xor dx, dx
div const_10
or ax, ax
jz @eq_0
add [di-2], ax
mov [di], dx
@eq_0:
add si, 2
add di, 2
loop @summ_1
pop cx
loop @division_2
mov cx, p
mov si, offset b
mov di, offset a
rep movsw
mov cx, p
mov si, offset c
add si, cx
add si, cx
@shift_1:
mov ax, [si-2]
mov [si], ax
sub si, 2
loop @shift_1
;---------------------------------
mov cx, 200
@perevod_1:
push cx
mov si, offset c
mov cx, p
add si, cx
add si, cx
sub si, 2
mov f, 0
@perevod_2:
mov ax, [si]
shl ax, 1
add ax, f
xor dx, dx
div const_10
mov f, ax
mov [si], dx
sub si, 2
loop @perevod_2
pop ax
push ax
mov bx, 200
sub bx, ax
add bx, offset w
cmp word ptr c, 1
jnz @not_1
mov word ptr c, 0
mov byte ptr [bx], 1
jmp short @next
@not_1:
mov byte ptr [bx], 0
@next:
pop cx
loop @perevod_1
mov si, offset w
mov cx, 100
@out_1:
mov ah, 2
mov dl, [si]
add dl, 30h
int 21h
inc si
loop @out_1
mov ah, 2
mov dl, 0Dh
int 21h
mov ah, 2
mov dl, 0Ah
int 21h
ret
Perevod endp
опять какойто косяк:
Код: Выделить всё
model tiny
masm
.386
.code
assume cs:@code,ds:@code,es:@code,ss:@code
org 100h
begin:
del db 4 ; делитель
long dw 1 ; делимое
mov dx,long ; dx=0001h, старшая часть
; делимого
; ax=0000h , младшая часть
; делимого
movzx bx,del
mov si,offset s ; результат
mov di,offset a ; временный массив
mov ax,1
xor dx,dx
mov cx,42
divide:
div bx ;s=s/n
mov [si],ax ;s---->()()()()
inc si
inc si
xor ax,ax
loop divide
mov si,0
;-------------------------------------------------------------------------
call Output
;--------------------------------------------------------------------------
;s1=s
mov si,offset s
mov di,offset a
push di
mov cx,21
rep movsw ;end s1=s
mov si,di
mov cx,42
tell:
push cx
double:
mov al,[si] ; s1:=s1\n
div bl
mov [si],ax
inc si
loop double
pop cx
stc
mov si,offset s ;сложение [di]+[si]
mov di,offset a
push cx
pushf
@label:
popf
mov al,[si]
adc [di],al
pushf
inc si
inc di
loop @label
popf
pop cx
loop tell
mov si,0
call output
mov ah,4ch
int 21h
;--------------------------------------------------------------------------------------------------------------------------------------
Output proc near ; Вывод на экран в двоичной форме
xor al,al
mov cx,10 ; сколько байт выводить
@h:
mov al,[si]
push cx
mov cx,8
mov ah,02
@w:
sal al,1
jc w0
mov dl,'0' ; печать '0'
int 21h
jmp short w1
w0:
mov dl,'1'
int 21h ; печать '1'
w1:loop @w
dec si
pop cx
loop @h
Output endp
;----------------------------------------------------------------------------------------------------------------
s db 42 dup(?) ;результат
a db 42 dup(?) ;определение временного массива
end begin