посмотрте код

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
john_1
Сообщения: 19
Зарегистрирован: 16 ноя 2006, 07:18

написать программу,использующую процедуру вычисления двоичного представления числа 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

народ подскажите как осуществить вывод ?
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):xor ax,ax;
mov bl,5 ; делитель
push ds
pop es

divide:
div bl ;s=s/n
Почему ты думаешь что это будет работать? Ты делишь 16 разрядов в AX на 8 разрядов в BL
И к тому же не вижу смысла в этом цикле, потому как массив заполняется нулями
&quot писал(а):mov cl,42
А ты уверен, что в CH будет 0, у тебя же цикл на CX построен.
&quot писал(а):double:
push cx
mov al,[si] ; s1:=s1\n
div bl ; или bx
mov [si],ax
inc si
pop cx
loop double
А в CX-то у нас что? Правильно - 0, так как перед ним был REP MOVSB
Зачем писать AX в [SI] если потом идет inc si
&quot писал(а):push cx
mov al,[di] ;сложение [di]+[si]
adc al,[si]
mov [si],al
dec si
dec di
pop cx
Может и в этом смысл есть, только вот команды DEC изменяют флаг CF.

Дельный совет тебе дам, сделай рабочий код - а на экран вывести - это уже самое последнее дело.
john_1
Сообщения: 19
Зарегистрирован: 16 ноя 2006, 07:18

Почему ты думаешь что это будет работать? Ты делишь 16 разрядов в Ax на 8 разрядов в Bl

а как еще то, делитель в 2 раза больше делителя(или я не прав?)
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):mov dx,word ptr long ; dx=0001h, старшая часть
; делимого
; ax=0000h , младшая часть
; делимого
xor ax,ax;
mov bl,5 ; делитель
Тогда зачем писать про DX и AX - ты же вроде эту пару хотел поделить? А у тебя делится AX на BL - то есть 0 на 5 - результат - 0, остаток 0 - какой смысл-то?
john_1
Сообщения: 19
Зарегистрирован: 16 ноя 2006, 07:18

Мне препод сказал так,я сначала вот так сделал
mov dx,word ptr long+2; dx=0001h, старшая часть
; делимого
mov ax,word ptr long ; ax=0001h , младшая часть
подскажи как надо.....
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Да я бы сказал, только вот что измениться - я лично не могу понять, что происходит. Какова идея-то?
john_1
Сообщения: 19
Зарегистрирован: 16 ноя 2006, 07:18

а посмотри я на паскале как эту задачу решил
тут также
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Старался писать простым языком не используя сложные конструкции, переведено на ассемблер с 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
john_1
Сообщения: 19
Зарегистрирован: 16 ноя 2006, 07:18

опять какойто косяк:

Код: Выделить всё

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
Ответить