Работа с большими числами - Assembler (223762)
Формулировка задачи:
Написала программу, с маленькими числами работает. Подскажите, пожалуйста, как сделать, чтобы с большими числами работала.
text segment 'code'
assume cs:text, ds:data
myproc proc
mov ax, data
mov ds, ax
lea dx, str1
mov ah, 09h
int 21h
mov ax,138
imul x
mov bx,dx
mov cx,ax
mov ax,k
imul z
add ax,cx
mov cx,ax
mov ax,k
mov bx,z
sub ax,bx
mov bx,ax
mov ax,cx
idiv bx
mov bx,ax
mov ax,x
imul x
sub bx,ax
mov ax,bx
call outp
mov y, ax
lea dx, str2
mov ah, 09h
int 21h
mov ax, 4c00h
int 21h
myproc endp
outp proc
push ax
push cx
push dx
push bx
xor cx,cx
mov bx, 000Ah
cont: xor dx, dx
div bx
push dx
inc cx
or ax, ax
jnz cont
mov ah, 02h
next:
pop dx
add dl, 30h
int 21h
loop next
pop bx
pop dx
pop cx
pop ax
ret
outp endp
text ends
data segment
x dw 10
k dw 4400
z dw 4000
y dw ?
str1 db 'reschenie y=(138x+k*z)/(k-z)-x*x', 0Ah, 0Dh, '$'
str2 db 0Ah, 0Dh, 'rechenie zakoncheno', 0Ah, 0Dh, '$'
data ends
stack1 segment para stack 'stack'
db 128 dup (?)
stack1 ends
end myprocРешение задачи: «Работа с большими числами»
textual
Листинг программы
;fasm code.... format MZ org 100h jmp start str1 db 13,10,' X=10, K=4400, Z=4000' db 13,10,' Y=(138x+k*z)/(k-z)-x*x' db 13,10,' -------------------------' db 13,10,' Result: $' X dd 10 K dd 4400 Z dd 4000 start: mov ah,9 ; мессага mov dx,str1 ; int 21h ; mov ebx,[X] ; imul ebx,ebx ; mov eax,[K] ; sub eax,[Z] ; sub eax,ebx ; push eax ; запомним правую часть mov ebx,[K] ; imul ebx,[Z] ; mov eax,138 ; imul eax,[X] ; add eax,ebx ; pop ebx ; xor edx,edx ; div ebx ; результат в EAX:EDX push edx ; запомним остаток mov ebx,10 ; система счисления call hex2asc ; выводим EAX на экран! (целое) mov al,'.' ; разделитель.. int 29h ; pop eax ; выводим EDX на экран! (остаток) call hex2asc ; exit: xor ax,ax ; int 16h ; mov ax,4c00h ; int 21h ; выход! ;----------------------------------------------------- hex2asc: ; Функция переводит числа в символы pushad ; Вход: EАХ = число, EBX = система счисления xor ecx,ecx ; Выход: на экране isDiv: ; xor edx,edx ; div ebx ; push edx ; inc ecx ; or eax,eax ; jnz isDiv ; isOut: ; pop eax ; cmp al,9 ; jle noHex ; add al,7 ; noHex: ; add al,30h ; int 29h ; loop isOut ; popad ; ret ;