السلام عليكم
اريد المساعدة في برنامج بلغة الاسمبلي
يقوم بإدخال عددين من منزلتين ثم جمعهم وطرحهم ثم اظهار الناتج
لقد حاولت ولكن كان المشغل يعطي اخطاء ولم استطيع معالجتها!!!
أرجو المساعدة....... سأعرض محاولتي ....
#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