פורסם 2013 בדצמבר 411 שנים התרגיל הואעליך לממש תוכנית אסמבלי המקבל מספר 32 ביט ומוצא את המספרים העמיתים הכי קרובים לו משני הכיוונים את המספר זה מקבל כמו שצריך וממיר אותו מASCII למספר והלולאה הראשונה נראה שגם עובדת; hw2.asm .MODEL SMALL .STACK 100h .DATA .386FirstStr DB 'This program find amicable numbers',10,'Enter number: ',13,10,'$'strResult DB 13,10,'The result is: ',13,10,'$'TEN DD 10temp DD 0TWO DD 2temp2 DD 0dec1 DD 0dec2 DD 0num DD 0numB DD 0numA DD 0numA1 DD 0numB1 DD 0sum DD 0sum2 DD 0divi DD 1flag DD 0 .CODE MOV AX,@DATA ; DS can be written to only through a register MOV DS,AX ; Set DS to point to data segment MOV AH,9 ; Set print option for int 21h MOV DX,OFFSET FirstStr ; Set DS:DX to point to PromptString INT 21h ; Print DisplayString CALL Get_num ;הלייבל לא מוגדר בשום מקום MOV num,EAX MOV temp,0 ;מיותר MOV sum,0 ;מיותר MOV temp,EAX MOV EBX,EAX MOV EAX,0 ADD temp,1 MOV ECX,numloop_low: CMP ECX,0;ECX JE contin_code CMP numA,0 JNE contin_code CMP numB,0 JNE contin_code DEC temp MOV EAX,0 FIRSTLOOP: CMP EBX,divi JE end1 MOV EAX,temp MOV EDX,0 DIV divi CMP DL,0 JNZ case1 MOV EAX,0 MOV EAX,divi ADD sum,EAX INC divi JMP FIRSTLOOP case1: MOV EAX,0 INC divi JMP FIRSTLOOP end1: MOV EAX,0 MOV EAX,sum MOV EBX,0 MOV divi,1 SECONDLOOP: MOV EBX,divi CMP EBX,sum JE end2 MOV EAX,sum MOV EDX,0 DIV divi CMP DL,0 JNZ case2 MOV EAX,0 MOV EAX,divi ADD sum2,EAX INC divi JMP SECONDLOOPcase2: MOV EAX,0 INC divi JMP SECONDLOOPend2: MOV EBX,0 MOV EBX,sum2 CMP EBX,temp JNE contin_loop MOV numA,EBX MOV EBX,sum MOV numB,EBX JMP contin_codecontin_loop: DEC ECX JMP loop_low ;ABOVE IS GOODcontin_code: MOV EAX,0 MOV sum,0 MOV sum2,0 MOV EBX,0 MOV ECX,0 MOV EAX,num MOV temp,EAX MOV EDX,0 DIV TWO MOV ECX,EAX SUB temp,1 MOV divi,1loop_high: CMP ECX,0 JE print_numA CMP numA1,0 JNE print_numA CMP numB1,0 JNE print_numA INC temp MOV EAX,0 MOV EBX,temphigh_loop1: CMP EBX,divi JE end_high1 MOV EAX,temp MOV EDX,0 DIV divi CMP DL,0 JNZ high_case1 MOV EAX,0 MOV EAX,divi ADD sum,EAX INC divi JMP high_loop1high_case1: MOV EAX,0 INC divi JMP high_loop1 end_high1: MOV EAX,0 ;MOV EAX,sum MOV EBX,0 MOV divi,1 high_loop2: MOV EBX,divi CMP EBX,sum ;בגלל שמה שמשתנה עכשיו זה הדיוי והסאם נשאר קבוע JE end_high2 MOV EAX,sum MOV EDX,0 DIV divi CMP DL,0 JNZ high_case2 MOV EAX,0 MOV EAX,divi ADD sum2,EAX INC divi JMP high_loop2high_case2: MOV EAX,0 INC divi JMP high_loop2end_high2: MOV EBX,0 MOV EBX,sum2 CMP EBX,temp JNE contin_loop2 MOV numA1,EBX MOV EBX,sum MOV numB1,EBX JMP print_numAcontin_loop2: DEC ECX JMP loop_high print_numA: MOV SI,0 LEA SI,strResult[40] MOV EAX,numA1PRINT1: MOV EDX,0 ; convert the result back to ascii DIV Ten ADD DX,'0' MOV [si],DX DEC SI CMP EAX,0 JE print_numB JMP print1print_numB: SUB SI,2 MOV EAX,numB1PRINT2: MOV EDX,0 ; convert the result back to ascii DIV Ten ADD DX,'0' MOV [SI],DX DEC SI CMP EAX,0 JE ED JMP print2ED: MOV AH,9 MOV DX,OFFSET strResult INT 21h JMP ENDC; Get_num PROC near ;GET THE NUM MOV EBX,0 MOV temp,0scan: MOV AH,1 ; DOS get character function # INT 21h ; Get a single character from keyboard CMP AL,0Dh JE ENDCODE SUB EAX,'0' MOV AH,0 MOV temp,EAX MOV EAX,sum MUL TEN ADD EAX,temp MOV sum,EAX MOV EAX,0 JMP scanENDCODE: MOV EAX,sum RET Get_num ENDPENDC: MOV EAX,0 MOV AH,4Ch ; Set terminate option for int 21h INT 21h ; Return to DOS (terminate program) END
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.