עזרה בתרגיל באסמבלי(מספרים ידידים) - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

עזרה בתרגיל באסמבלי(מספרים ידידים)


Styx

Recommended Posts

התרגיל הוא

עליך לממש תוכנית אסמבלי המקבל מספר 32 ביט ומוצא את המספרים העמיתים הכי קרובים לו משני הכיוונים

את המספר זה מקבל כמו שצריך וממיר אותו מASCII למספר והלולאה הראשונה נראה שגם עובדת


; hw2.asm



.MODEL SMALL

.STACK 100h

.DATA

.386

FirstStr DB 'This program find amicable numbers',10,'Enter number: ',13,10,'$'

strResult DB 13,10,'The result is: ',13,10,'$'

TEN DD 10

temp DD 0

TWO DD 2

temp2 DD 0

dec1 DD 0

dec2 DD 0

num DD 0

numB DD 0

numA DD 0

numA1 DD 0

numB1 DD 0

sum DD 0

sum2 DD 0

divi DD 1

flag 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,num

loop_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 SECONDLOOP

case2:

MOV EAX,0

INC divi

JMP SECONDLOOP

end2:

MOV EBX,0

MOV EBX,sum2

CMP EBX,temp

JNE contin_loop

MOV numA,EBX

MOV EBX,sum

MOV numB,EBX

JMP contin_code

contin_loop:

DEC ECX

JMP loop_low

;ABOVE IS GOOD



contin_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,1

loop_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,temp

high_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_loop1

high_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_loop2

high_case2:

MOV EAX,0

INC divi

JMP high_loop2

end_high2:

MOV EBX,0

MOV EBX,sum2

CMP EBX,temp

JNE contin_loop2

MOV numA1,EBX

MOV EBX,sum

MOV numB1,EBX

JMP print_numA

contin_loop2:

DEC ECX

JMP loop_high







print_numA:

MOV SI,0

LEA SI,strResult[40]

MOV EAX,numA1

PRINT1:

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 print1



print_numB:

SUB SI,2

MOV EAX,numB1

PRINT2:

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 print2

ED:

MOV AH,9

MOV DX,OFFSET strResult

INT 21h

JMP ENDC

;

Get_num PROC near ;GET THE NUM

MOV EBX,0

MOV temp,0

scan:

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 scan

ENDCODE:

MOV EAX,sum

RET

Get_num ENDP

ENDC:

MOV EAX,0

MOV AH,4Ch ; Set terminate option for int 21h

INT 21h ; Return to DOS (terminate program)

END





קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...