الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ تمت الإجابة ]كيفية جمع وطرح وإظهار أعداد من منزلتين

بدأه om rneem في 13 ديسمبر 2009 · 5 رد · 1,665 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اريد المساعدة في برنامج بلغة الاسمبلي

يقوم بإدخال عددين من منزلتين ثم جمعهم وطرحهم ثم اظهار الناتج

لقد حاولت ولكن كان المشغل يعطي اخطاء ولم استطيع معالجتها!!!

أرجو المساعدة....... سأعرض محاولتي ....

#make_COM#

; COM file is loaded at CS:0100h
ORG 100h

name "calc"
PRINTN MACRO sdat
LOCAL next_char,s_dcl,printed,skip_dcl
PUSH AX
PUSH SI
JMP skip_dcl
s_dcl DB sdat, 0Dh .0Ah ,0

skip_dcl:
LEA SI,s_dcl

next_char:
mov al,cs:[SI]
CMP al,0
JZ printed
inc SI
mov ah,0eh
int 10h
jmp next_char
ptinted:

pop SI
POP AX
ENDM

PUTC MACRO CHAR
PUSH AX
MOV AL,char
MOV AH,0Eh
INT 10H
POP AX
ENDM

org 100H

jmp start
msgl db 0dh ,0ah
db 0dh,0ah,

msg2 db 0dh,0ah

msg3 db 0dh,0ah

num dw ?

start:

mov dx, offset msg1
mov ah,9
int 21h

call scan_num

mov num,cx

mov dx ,offset msg2
mov ah,9
int 21h

call scan_num
add num,cx
jo overflow

mov dx,offset msg3
mov ah,9
int 21h

mov ax ,num
call print_num

jmp exit

overflow:
printn


exit:

mov ah,0
int 16h

ret

SCAN_NUM PROC NEAR
PUSH DX
PUSH AX
PUSH SI
MOV CX,0
MOV CS:make_minus,0

next_digit:
MOV AH,00H
INT 16H

MOV AH,0EH
INT 10H

CMP AL,'-'
JE set_minus

CMP AL,0DH
JNE not_cr
JMP stop_input
not_cr:

CMP AL,8
JNE backspace_checked
MOV DX,0
MOV AX,CX
DIV CS:ten
MOV CX,AX
PUTC ''
PUTC 8
JMP next_digit

backspace_checkad:
CMP AL,'0'
JAE ok_AE_0
JMP remove_not_digit

ok_AE_0:
CMP AL,'9'
JBE ok_digit
remove_not_digit:
PUTC 8
PUTC ''
PUTC 8
JMP next_digit
ok_digit:
push ax
mov ax,cx
mul cs:ten
MOV CX,AX
POP AX

CMP DX 0
JNE too_big

SUB AL,30H

MOV AH,0
MOV DX ,CX
ADD CX,AX
JC too_big2

JMP next_digit

set_minus:
MOV CS:make_minus,1
JMP next_digit

too_big2:
MOV CX,DX
MOV DX,0

too_big:
MOV AX,CX
DIV CS:ten
MOV CX,AX
PUTC 8
PUTC ''
PUTC 8
JMP next_digit

stop_input:
CMP CS:make_minus,0
JE not_minus
NEG CX

not_minus:
POP SI
POP AX
POP DX
RET

make_minus DB ?
SCAN_NUM ENDP
PRINT_NUM PROC NEAR
PUSH DX
PUSH AX
CMP AX,0
JNZ not_zero
PUTC '0'
JMP printed

not_zero:
CMP AX,0
JNS positive
NEG AX
PUTC '-'
positive:
CALL PRINT_NUM_UNS
printed:
POP AX
POP DX
RET
PRINT_NUM ENDP

PRINT_NUM_UNS PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX,1
MOV BX,10000
CMP AX,0
JZ print_zero
begin_print:
CMP BX,0
JZ end_print
CMP CX,0
JE calc
CMP AX,BX
JB skip
calc:
MOV CX,0
MOV DX,0
DIV BX

ADD AL,30H
PUTC AL

MOV AX,DX
skip:
PUSH AX
MOV DX,0
MOV AX,BX
DIV CS:ten
MOV BX,AX
POP AX
JMP begin_print
print_zero:
PUTC '0'
end_print:
POP DX
POP CX
POP BX
POP AX
RET
PRINT_NUM_UNS ENDP

ten DW 10

تم تعديل هذه المشاركة بواسطة Xacker في 14 ديسمبر 2009 في 11:59

#2

السلام عليكم

أخيWajdy Essam

لو سمحت قرأت في بعض مواضيع الاخوة الموجودين انك محترف بالاسمبلي

ف لو سمحت انك تقرأ محاااولاااتي وترد عليها باقرب وقت

#3

أنا متأكد من أنك لم تقومي بقراءة نصوص الأخطاء التي كانت تظهر لك... فقط "ظهرت معي أخطاء > لأذهب للفريق العربي للبرمجة وأكتب موضوع"

لأن نصوص الأخطاء واضحة وهذا شئ مزعج.

أخطاؤك إملائية في معظمها، msgl بدلاً من msg1 و backspace_checkad بدلاً من backspace_checked وقس على هذا..

هناك تعليمة، PUTC '' لا أعرف ما الذي تحاولين طباعته على النافذة.. بكل الأحوال لا يوجد char اسمه .. بدون اسم!

هذا تعديل لإلغاء الأخطاء، افترضت أن PUTC '' القصد منها وضع مسافة

#make_COM#

; COM file is loaded at CS:0100h
ORG 100h

name "calc"
PRINTN MACRO sdat
LOCAL next_char,s_dcl,printed,skip_dcl
PUSH AX
PUSH SI
JMP skip_dcl
s_dcl DB sdat, 0Dh .0Ah ,0

skip_dcl:
LEA SI,s_dcl

next_char:
mov al,cs:[SI]
CMP al,0
JZ printed
inc SI
mov ah,0eh
int 10h
jmp next_char
printed:

pop SI
POP AX
ENDM

PUTC MACRO CHAR
PUSH AX
MOV AL,char
MOV AH,0Eh
INT 10H
POP AX
ENDM

;org 100H

jmp start 

msg1 db 0dh,0ah,0dh,0ah,"$"

msg2 db 0dh,0ah,"$"

msg3 db 0dh,0ah,"$"

num dw ?

start:

mov dx,offset msg1
mov ah,9
int 21h

call scan_num

mov num,cx

mov dx ,offset msg2
mov ah,9
int 21h

call scan_num
add num,cx
jo overflow

mov dx,offset msg3
mov ah,9
int 21h

mov ax ,num
call print_num

jmp exit

overflow:
printn


exit:

mov ah,0
int 16h

ret

SCAN_NUM PROC NEAR
PUSH DX
PUSH AX
PUSH SI
MOV CX,0
MOV CS:make_minus,0

next_digit:
MOV AH,00H
INT 16H

MOV AH,0EH
INT 10H

CMP AL,'-'
JE set_minus

CMP AL,0DH
JNE not_cr
JMP stop_input
not_cr:

CMP AL,8
JNE backspace_checked
MOV DX,0
MOV AX,CX
DIV CS:ten
MOV CX,AX
PUTC ' '
PUTC 8
JMP next_digit

backspace_checked:
CMP AL,'0'
JAE ok_AE_0
JMP remove_not_digit

ok_AE_0:
CMP AL,'9'
JBE ok_digit
remove_not_digit:
PUTC 8
PUTC ' '
PUTC 8
JMP next_digit
ok_digit:
push ax
mov ax,cx
mul cs:ten
MOV CX,AX
POP AX

CMP DX,0
JNE too_big

SUB AL,30H

MOV AH,0
MOV DX ,CX
ADD CX,AX
JC too_big2

JMP next_digit

set_minus:
MOV CS:make_minus,1
JMP next_digit

too_big2:
MOV CX,DX
MOV DX,0

too_big:
MOV AX,CX
DIV CS:ten
MOV CX,AX
PUTC 8
PUTC ' '
PUTC 8
JMP next_digit

stop_input:
CMP CS:make_minus,0
JE not_minus
NEG CX

not_minus:
POP SI
POP AX
POP DX
RET

make_minus DB ?
SCAN_NUM ENDP
PRINT_NUM PROC NEAR
PUSH DX
PUSH AX
CMP AX,0
JNZ not_zero
PUTC '0'
JMP printed

not_zero:
CMP AX,0
JNS positive
NEG AX
PUTC '-'
positive:
CALL PRINT_NUM_UNS
printed:
POP AX
POP DX
RET
PRINT_NUM ENDP

PRINT_NUM_UNS PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CX,1
MOV BX,10000
CMP AX,0
JZ print_zero
begin_print:
CMP BX,0
JZ end_print
CMP CX,0
JE calc
CMP AX,BX
JB skip
calc:
MOV CX,0
MOV DX,0
DIV BX

ADD AL,30H
PUTC AL

MOV AX,DX
skip:
PUSH AX
MOV DX,0
MOV AX,BX
DIV CS:ten
MOV BX,AX
POP AX
JMP begin_print
print_zero:
PUTC '0'
end_print:
POP DX
POP CX
POP BX
POP AX
RET
PRINT_NUM_UNS ENDP

ten DW 10

حاولي من جديد الآن.

تم تعديل هذه المشاركة بواسطة Xacker في 21 ديسمبر 2009 في 16:38

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4

مشكور يا اخي

أنا أعرف انه لدي أخطاء ولكني لم استطع معالجتها

شكرا لمحاولتك ولكن محاولتك توجد فيها بعض الاخطاء ايضا وما عرفت اعالجها

اريد برنامج يقوم بادخال عددين من منزلتين وجمعهم وطرحهم ثم طباعة النتائج ع شاشة المخرجات

يرجى المساعدة

وشكرا لكم

:blush:

#5

كل ما فعلته أني أرشدتك إلى أسباب الأخطاء الإملائية وليس البرمجية.. لم أعدل شئ في شفرة البرنامج ولا أعرف هل ما تقومين به صح أو خطأ لأني لم أنظر تفاصيله :huh:

سأضع كود للحساب لاحقاً.. لا أعرف متى.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#6

كما وعدت

.model small

.stack 100h

.data
num1	db	'Enter first number: ','$'
n1		db	3,4 dup (0)
num2	db	'Enter second number: ','$'
n2		db	3,4 dup (0)
CRLF	db	0Dh,0Ah,'$'
nBuff1	db	4 dup (0)
nBuff2	db 	4 dup (0)
addi	db	'A+B = ','$'
subt	db	'A-B = ','$'
toExit	db	'Press any key to exit...','$'

.code
main	proc	far
	mov ax,@data
	mov ds,ax
	;-
	mov dx,offset num1
	mov ah,9
	int 21h
	;
	mov dx,offset n1
	mov ah,0Ah
	int 21h
	;
	mov dx,offset CRLF
	mov ah,9
	int 21h
	;
	mov dx,offset num2
	int 21h
	;
	mov dx,offset n2
	mov ah,0Ah
	int 21h
	;
	mov dx,offset CRLF
	mov ah,9
	int 21h
	;-
	; change first number into hex
	mov si,offset n1
	add si,2
	call atodw
	; save first number into stack
	push cx
	; change second number into hex
	mov si,offset n2
	add si,2
	call atodw
	; retreive first number from stack
	pop ax
	; save first and second numbers into stack to use it with subtract
	push ax ; first num
	push cx ; second num
	;
	add ax,cx ; calc addition
	mov bx,offset nBuff1
	call dwtoa
	mov dx,offset addi
	mov ah,9
	int 21h
	mov dx,offset nBuff1
	int 21h
	mov dx,offset CRLF
	int 21h
	;
	pop bx	; restore second num
	pop ax	; restore first num
	sub ax,bx
	mov bx,offset nBuff2
	call dwtoa
	mov dx,offset subt
	mov ah,9
	int 21h
	mov dx,offset nBuff2
	int 21h
	mov dx,offset CRLF
	int 21h
	;
	mov dx,offset toExit
	int 21h
	mov ah,8
	int 21h
	;
	mov ax,4C00h
	int 21h
main	endp

atodw	proc	near

	xor ax,ax
	xor cx,cx
	mov bx,10
	mov al,[si]
	inc si
	.while (al != 0Dh)
		sub al,30h
		xor ah,ah
		push ax
		mov ax,cx
		mul bx
		pop cx
		add cx,ax
		mov al,[si]
		inc si
	.endw
	ret

atodw endp

dwtoa proc	near

	mov dx,ax
	mov di,bx
	test ax,ax
	jnz	sign
zero:
	mov word ptr [di],30h
	jmp	dtaexit
sign:
	jns pos
	mov [di],"-"
	neg ax
	inc di
pos:
	mov cx,10
	mov si,di

	.while (ax > 0)
		xor dx,dx
		div cx
		add dl,30h
		mov [di],dl
		inc di
	.endw

	mov [di],"$"

	.while (si < di)
		sub di,1
		mov al,[si]
		mov ah,[di]
		mov [di],al
		mov [si],ah
		add si,1
	.endw

dtaexit:
	ret

dwtoa endp
end main

post-7008-12614025375893_thumb.png

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…