PDA

View Full Version : سوال: کد اسمبلی



حمیده ایرانی
پنج شنبه 05 فروردین 1389, 11:49 صبح
سلام
من کد زیر را برای گرفتن یک رشته عددی وتبدیل آن به عدد صحیح و قرار دادن در ثبات ax
و چاپ عدد موجود در ax نوشتم ولی درست کار نمکند مشکل چیست؟


datasg segment 'data'
buf_in label byte
buf_len db 20
real_len dw ?
data2 db 20 dup(' ')
data1 db 10 dup(' ')
msg1 db 'enter a number:','$'
msg2 db 'factorial is:','$'
result dw ?
datasg ends
codesg segment 'code'
assume cs:codesg,ds:datasg,ss:stacksg
main proc far
mov ax,datasg
mov ds,ax
mov dx, offset msg1
mov ah,09h
int 21h
;;;;;;read string;;;;;;;;;;;;

lea dx,buf_in
mov ah,0ah
int 21h
;;;convert string to number;;
dec real_len
mov si,-1
mov ax,0
mov cl,10
mov bh,0
back:inc si
mov bl,data2[si]
sub bl,30h
mul cl
add ax,bx
cmp si,real_len
jl back
mov result,ax
mov dx,0
mov cx,10
mov di,0
mov si,0
back1:div cx
inc di
cmp ax,0
jg back1
mov si,di
dec di
mov ax,result
mov cx,10
back2:mov dx,0
div cx
or dl,30h
mov data1[di],dl
dec di
cmp ax,0
jg back2
mov data1[si],'$'
mov dh,3
mov dl,0
mov bh,0
mov ah,2h
int 10h
mov dx,offset msg2
mov ah,09h
int 21h

lea dx,data1
mov ah,09h
int 21h
;;;;;;;;;;;;;END;;;;;;;;;;;;;;;
mov ah,8h
int 21h

mov ah,4ch
int 21h
main endp
codesg ends
end main
end

tdkhakpur
پنج شنبه 05 فروردین 1389, 21:55 عصر
سلام
شما برای محاسبه فاکتوریل مشکل دارید شرمنده برای اصلاح وقت نداشتم فقط قسمت فاکتوریل را اصلاح کنید


stacksg segment 'stack' ; اینجا اضافه شد
db 512 dup(?)
stacksg ends
datasg segment 'data'
buf_in label byte
buf_len db 20
real_len dw ?
data2 db 20 dup(' ')
data1 db 10 dup(' ')
msg1 db 'enter a number:','$'
msg2 db 'factorial is:','$'
result dw ?
datasg ends
codesg segment 'code'
assume cs:codesg,ds:datasg,ss:stacksg
main proc far
mov ax,datasg
mov ds,ax
mov dx, offset msg1
mov ah,09h
int 21h
;;;;;;read string;;;;;;;;;;;;
lea dx,buf_in
mov ah,0ah
int 21h
;;;convert string to number;---------;
dec real_len ;
mov si,-1 ;
mov ax,0 ;
mov cl,10 ;
mov bh,0 ;
back: ;
inc si ;
mov bl,data2[si] ;
sub bl,30h ;
mul cl ;
add ax,bx ;
cmp si,real_len ;
jl back ;
mov result, ax
; calculate factorial ;---------------;; این قسمت را برای محاسبه فاکتوریل اصلا کنید
mov dx,0 ;
mov cx,10 ;
mov di,0 ;
mov si,0 ;
back1: ;
div cx ;
inc di ;
cmp ax,0 ;
jg back1 ;-----------------------;
mov si,di
dec di
;;;;;;;;;;;;;;;;;;;; print and convert to string result number
mov ax,result
mov cx,10
back2:
mov dx, 0 ; اینجا مشکل بود که بالا قید کرده بودید
div cx
add dl,30h
mov data1[di],dl
dec di
cmp ax,0
jg back2
mov data1[si],'$'
;------------ set cursor pos
mov dh,3
mov dl,0
mov bh,0
mov ah,2h
int 10h
;--------- print message ----------------
mov dx,offset msg2
mov ah,09h
int 21h
;--------- print result number ----------
lea dx,data1
mov ah,09h
int 21h
;;;;;;;;;;;;;END;;;;;;;;;;;;;;;
mov ah,8h
int 21h
mov ah,4ch
int 21h
main endp
codesg ends
end main
end