
این برنامه بصورتی کار میکنه که مقدار طول ها و تعداد شکل ها رو از Data Segment چک میکنه و بعد از هر بار دور زدن از تعداد ستاره های قابل چاپ شدن کم مینه و cursor رو به داخل shift میکنه تا شکل بعدی رو با ابعاد جدید نمایش بده, سورس رو میتونید از داخل صفحه کپی کنید, این سورس با Emu 8086 نسخه 4 به بالا سازگاره..
; multi-segment executable file template. data segment ; add your data here! pkey db "YEAHHHHH!!!..$" ;my data: rac db -2 ;for modifying the position of cursor wah db 19 ;size of shapes round db 5 ;my data ends. ends stack segment dw 128 dup(0) ends code segment start: ; set segment registers: mov ax, data mov ds, ax mov es, ax ; add your code here ;my code: sto:;star row MOV CH,wah ;counter for stars, starting at 19 MOV CL,rac MOV BL,rac INC CL INC CL INC BL INC BL nxc:MOV AH,2 ; MOV DL,CL ;>columns. MOV DH,BL ;>modifying the cursor position MOV BH,0 ; starting from -2(0). INT 10H ; MOV DL,'*' ; MOV AH,2 ;>printing stars INT 21H ; INC CL DEC CH ;1 star rows JNZ nxc ; ;star column MOV CH,wah nxr:MOV AH,2 ; MOV DL,CL ;>columns:static MOV DH,BL ;>rows:dynamic MOV BH,0 ; INT 10H ; MOV DL,'*' ; MOV AH,2 ;>printing stars INT 21H ; INC BL DEC CH JNZ nxr ;star row back MOV CH,wah nxt:MOV AH,2 ; MOV DL,CL ;>columns:dynamic MOV DH,BL ;>rows:static MOV BH,0 ; INT 10H ; MOV DL,'*' ; MOV AH,2 ;>printing stars INT 21H ; DEC CL DEC CH JNZ nxt ;star column back MOV CH,wah nxs:MOV AH,2 ; MOV DL,CL ;>columns:dynamic MOV DH,BL ;>rows:static MOV BH,0 ; INT 10H ; MOV DL,'*' ; MOV AH,2 ;>printing stars INT 21H ; DEC BL DEC CH JNZ nxs ;next round INC rac INC rac DEC wah DEC wah DEC wah DEC wah DEC round JNZ sto ;set position for "wait for any key...." MOV AH,2 ; MOV DL,4 ;>columns:dynamic MOV DH,22 ;>rows:static MOV BH,0 ; INT 10H ; ;my code ends. lea dx, pkey mov ah, 9 int 21h ; output string at ds:dx ; wait for any key.... mov ah, 1 int 21h mov ax, 4c00h ; exit to operating system. int 21h ends end start ; set entry point and stop the assembler.
هفته ی پیش توی دانشگاه یکی از اساتید محترم زبان برنامه نویسی اسمبلی تکلیفی رو برای دانشجو ها تعیین کردن که برنامه ای بنویسند به این صورت که طول ارتفاع یک مثلث رو از کاربر بگیره و مثلث رو با استفاده از کارکتر ستاره بکشه و نمایش بده, این برنامه رو من نوشتم و برای کسایی که توی نوشتنش مشکل داشتن و یا واسشون سوال پیش بود اینجا قرار دادم که امیدوارم با خوندنش بتونن ابهام رو برطرف کنن و اگه سوالی دارن توی نظرات از من بپرسن.
سورس رو از اینجا میتونید کپی کنید, یا فایل. رو مستقیم دانلود کنید:
; multi-segment executable file template. data segment ; add your data here! pkey db "press any key...$" inmsg DB "Please enter the triangle's height: $" mval DB 0 hr DB 0 row DB 0 starrow DB 1 sptemp DB 0 strtemp DB 0 strtemp2 DB 0 ends stack segment dw 128 dup(0) ends code segment start: ; set segment registers: mov ax, data mov ds, ax mov es, ax ; add your code here ; my code: LEA DX,inmsg ;asking user for entering the height MOV AH,9 ;asking user for entering the height INT 21H ;asking user for entering the height MOV AH,1 ;getting the height value INT 21H ;ascii character of height is saved in AL reg SUB AL,48 ;converts the ascii code to integer INC AL MOV BL,AL ;height is saved in BL reg (for horizontal spaces) MOV mval,BL MOV BH,AL ADD BH,BH ;BH = 2 * ENTERED_VALUE (for lower part) DEC BH ;real horizontal line value MOV hr,BH MOV CH,1 ;for counting the stars with CH reg MOV CL,0 ;for checking the number of CURRENT stars in a row MOV DL,10 ;going one level down | MOV AH,2 ;going one level down | INT 21H ;going one level down | ;>ENTER MOV DL,13 ;line beginning | MOV AH,2 ;line beginning | INT 21H ;line beginning | rcn:INC row ;|>counts the ROW number and saves in row MOV BH,row ;| MOV BL,mval ;| SUB BL,BH ;| jz j1 ;|>to finish the program! sp:MOV DL,' ' ;| MOV AH,2 ;|>PRINTING SPACE INT 21H ;| DEC BL ;using BL reg for counting the spaces JNZ sp ;prints space till BL > (mval-row) MOV strtemp,0 nxt:MOV DL,'*' ;puts star character in DL reg| MOV AH,2 ;prints the star |>PRINTING one STAR INT 21H ;prints the star | INC strtemp MOV CH,starrow ;checks the number of currently printed stars SUB CH,strtemp JNZ nxt ent:MOV DL,10 ;going one level down | MOV AH,2 ;going one level down | INT 21H ;going one level down | ;>ENTER MOV DL,13 ;line beginning | MOV AH,2 ;line beginning | INT 21H ;line beginning | INC starrow ;| INC starrow ;| ;|> decides how many stars should be printed in NEXT ROW JMP rcn ;| j1:MOV DL,7 ;finishing the program with a beep! MOV AH,2 INT 21H JNZ J1 ; my code end lea dx, pkey mov ah, 9 int 21h ; output string at ds:dx ; wait for any key.... mov ah, 1 int 21h mov ax, 4c00h ; exit to operating system. int 21h ends end start ; set entry point and stop the assembler.
برای دانلود فایل سورس روی دانلود کلیک کنید.