PDA

View Full Version : سوال: جمع دو عدد كه از ورودي گرفته مي شود



ali682344
چهارشنبه 28 مهر 1389, 21:56 عصر
سلام

به خدا دارم كلافه ميشم هر كاري مي كنم نمي تونم دو عدد را كه از وردي گرفتم با هم جمع كنم و چاپ كنم

نمونه كدي كه استفاده مي كنم به اين صورته :
; multi-segment executable file template.
;== NUMBER TO DECIMAL ================================================== ====;
; This Macro Chenge HEX Or Binary To Decimal .........................
; NUMBER Is (WORD) .................................................. ..
; RETURN : This Macro Return In bp Address Of Decimal Number That It
; Has In His End '$'
DECIMAL MACRO NUMBER
LOCAL BUFFER,COUNTER, LOOP_, E1, E2, E0, RESUM, WHILE ,WHILE_,E2_, E3, E4,LOOP__, JMP_1, EXIT_
JMP JMP_1
BUFFER DB 15 DUP('$')
COUNTER DB 0
JMP_1:
MOV CX, 11
MOV BUFFER[11], '$'
MOV BX, 10
LOOP__:;----------------------------------;
MOV BYTE PTR BUFFER[BX], 0 ; clear the buffer
DEC BX ;
LOOP LOOP__;------------------------;
CMP NUMBER, 0
JL E0
CMP NUMBER, 9
JG E0
MOV DX, NUMBER
MOV BYTE PTR BUFFER[10], DL
ADD BYTE PTR BUFFER[10], 30H
MOV BP, OFFSET BUFFER[10]
JMP EXIT_
E0:
MOV CX, NUMBER
MOV COUNTER, 0
LOOP_:
ADD COUNTER, 1
CMP COUNTER, 9
JNE E1
MOV BX, 10
MOV DL, COUNTER
ADD BYTE PTR BUFFER[BX], DL
WHILE:
CMP BYTE PTR BUFFER[BX], 9
JLE E2
SUB BYTE PTR BUFFER[BX], 10
DEC BX
ADD BYTE PTR BUFFER[BX], 1
JMP WHILE
E2:
MOV COUNTER, 0
E1:
LOOP LOOP_
RESUM:
MOV BX, 10
MOV DL, COUNTER
ADD BYTE PTR BUFFER[BX], DL
WHILE_:
CMP BYTE PTR BUFFER[BX], 9
JLE E2_
SUB BYTE PTR BUFFER[BX], 10
DEC BX
ADD BYTE PTR BUFFER[BX], 1
JMP WHILE_
E2_:
MOV BX, -1
E3:
INC BX
CMP BYTE PTR BUFFER[BX], 0
JE E3
LEA BP, BUFFER[BX]
E4:
MOV DL, BYTE PTR BUFFER[BX]
ADD BYTE PTR BUFFER[BX], 30H
INC BX
CMP BX, 11
JL E4
EXIT_:
ENDM

data segment

ends

stack segment
dw 128 dup(0)
ends

code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax
;;;;;;;;;;;;;;;;;;adad aval
mov ah,01h
int 21h
mov cx,ax

;;;;;;;;;;;;;;;;;;;;adad dovom
mov ah,01h
int 21h



add ax,cx ;;;;;;jam
DECIMAL ax
;;;;;;;;;;;;;;print
mov ah,02
mov dx,ax
int 21h

mov ax, 4c00h ; exit to operating system.
int 21h
ends

end start ; set entry point and stop the assembler.
كجاي اين كد مورد داره من خيلي مبتديم :عصبانی++::عصبانی++::گریه::گری :
ممنون

tdkhakpur
پنج شنبه 29 مهر 1389, 01:23 صبح
برای اینکه عملیات جمع را امتحان کنید دستی اعداد را باهم جمع بزنید برای دریافت از ورودی باید کد بنویسید.


; multi-segment executable file template
; This Macro Chenge HEX Or Binary To Decimal .........................
; NUMBER Is (WORD) .................................................. ..
; BUFFER is address of buffer
; digit is len of buffer or digit numbers
; RETURN : This Macro Return In bp Decimal Number That It
; Has In His End 0
DECIMAL MACRO NUMBER, BUFFER, DIGIT
LOCAL E0, E1, LOOP__, EXIT_
MOV BX, DIGIT
MOV BYTE PTR BUFFER[BX], '$' ;0
MOV CX, BX
LOOP__:;----------------------------------;
DEC BX ;
MOV BYTE PTR BUFFER[BX], 32 ; clear the buffer
LOOP LOOP__;------------------------;
MOV BX, DIGIT
MOV AX, NUMBER
E0:
MOV DX, 0
MOV CX, 10
DIV CX
DEC BX
MOV BYTE PTR BUFFER[BX], DL ; BAGIMANDEH IN DX
ADD BYTE PTR BUFFER[BX], 30H
CMP BX, 0
JE EXIT_
CMP AX, 10
JNL E0
E1:
DEC BX
MOV BYTE PTR BUFFER[BX], AL
ADD BYTE PTR BUFFER[BX], 30H
EXIT_:
ENDM
;---------------------------------------------
data segment
res dw ?
buf db 32 dup(?)
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
assume cs:code, ds:data, ss:stack
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax
;;;;;;;;;;;;;;;;;;adad aval
mov ah,01h
int 21h
mov cx,ax
;;;;;;;;;;;;;;;;;;;;adad dovom
mov ah,01h
int 21h
add ax,cx ;;;;;;jam
mov res, ax
DECIMAL res, buf, 5
;;;;;;;;;;;;;;print
mov ah, 9
lea dx, buf
int 21h
mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler

ali682344
پنج شنبه 29 مهر 1389, 15:49 عصر
برای اینکه عملیات جمع را امتحان کنید دستی اعداد را باهم جمع بزنید برای دریافت از ورودی باید کد بنویسید.


; multi-segment executable file template
; This Macro Chenge HEX Or Binary To Decimal .........................
; NUMBER Is (WORD) .................................................. ..
; BUFFER is address of buffer
; digit is len of buffer or digit numbers
; RETURN : This Macro Return In bp Decimal Number That It
; Has In His End 0
DECIMAL MACRO NUMBER, BUFFER, DIGIT
LOCAL E0, E1, LOOP__, EXIT_
MOV BX, DIGIT
MOV BYTE PTR BUFFER[BX], '$' ;0
MOV CX, BX
LOOP__:;----------------------------------;
DEC BX ;
MOV BYTE PTR BUFFER[BX], 32 ; clear the buffer
LOOP LOOP__;------------------------;
MOV BX, DIGIT
MOV AX, NUMBER
E0:
MOV DX, 0
MOV CX, 10
DIV CX
DEC BX
MOV BYTE PTR BUFFER[BX], DL ; BAGIMANDEH IN DX
ADD BYTE PTR BUFFER[BX], 30H
CMP BX, 0
JE EXIT_
CMP AX, 10
JNL E0
E1:
DEC BX
MOV BYTE PTR BUFFER[BX], AL
ADD BYTE PTR BUFFER[BX], 30H
EXIT_:
ENDM
;---------------------------------------------
data segment
res dw ?
buf db 32 dup(?)
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
assume cs:code, ds:data, ss:stack
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax
;;;;;;;;;;;;;;;;;;adad aval
mov ah,01h
int 21h
mov cx,ax
;;;;;;;;;;;;;;;;;;;;adad dovom
mov ah,01h
int 21h
add ax,cx ;;;;;;jam
mov res, ax
DECIMAL res, buf, 5
;;;;;;;;;;;;;;print
mov ah, 9
lea dx, buf
int 21h
mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler



بازم ممنون از كمكتون
ولي خوب من براي دو عدد از وفقه استفاده كردم
خروجي برنامه براي عدد4+5=617 دليلش چيه ؟

tdkhakpur
پنج شنبه 29 مهر 1389, 16:25 عصر
ببینید خود برنامه ایراد نداره شما میتوانید صحت کد رو با دادن ارقام بطور دستی تست کنید.
ولی وقتی شما از ورودی عدد میگیرید کد اسکی عدد داخل رجیستر قرار میگیره نه خود عدد مثلا اگر عدد کلید یک را بزنید عدد 31 داخل رجیستر قرار میگیره.

ali682344
پنج شنبه 29 مهر 1389, 21:58 عصر
ببینید خود برنامه ایراد نداره شما میتوانید صحت کد رو با دادن ارقام بطور دستی تست کنید.
ولی وقتی شما از ورودی عدد میگیرید کد اسکی عدد داخل رجیستر قرار میگیره نه خود عدد مثلا اگر عدد کلید یک را بزنید عدد 31 داخل رجیستر قرار میگیره.

ممنون دوست خوبم ولي منظورم تبديلش بود يعني خود عددو نشون بده

tdkhakpur
پنج شنبه 29 مهر 1389, 23:18 عصر
کد زیر رو جایگزین کد بالا فرار بده ببین چی نشون میده


;;;;;;;;;;;;;;;;;;;;adad dovom
mov ah,01h
int 21h
add ax,cx ;;;;;;jam
mov res, 1992 ;اینجا
DECIMAL res, buf, 5
;;;;;;;;;;;;;;print

ali682344
جمعه 30 مهر 1389, 10:18 صبح
کد زیر رو جایگزین کد بالا فرار بده ببین چی نشون میده


;;;;;;;;;;;;;;;;;;;;adad dovom
mov ah,01h
int 21h
add ax,cx ;;;;;;jam
mov res, 1992 ;اینجا
DECIMAL res, buf, 5
;;;;;;;;;;;;;;print



همون عدد رو نشون مي ده 1992

tdkhakpur
جمعه 30 مهر 1389, 11:43 صبح
همون عدد رو نشون مي ده 1992

پس کد شما تونسته اعداد رو در خروجی چاپ کنه حالا میتونید محاسبات خودتان را به این روش در خروجی ظاهر کنید.
موفق باشید.