ธนาวินท์ รักธรรมานนท์ fengtwr@ku.ac.th โครงสร้างควบคุม ธนาวินท์ รักธรรมานนท์ fengtwr@ku.ac.th
หัวข้อในวันนี้ โครงสร้างควบคุม โครงสร้างการตัดสินใจแบบ if-then-else โครงสร้างการกระทำซ้ำแบบ repeat-until โครงสร้างการกระทำซ้ำแบบ while โครงสร้างการกระทำซ้ำแบบ for
IF – THEN – ELSE IF condition THEN statement 1 ELSE statement 2 ; False True Statement2 Statement1
Nested Condition IF cond1 THEN statement1 ELSE IF cond2 THEN False True Statement1 condition2 Statement3 Statement2 IF cond1 THEN statement1 ELSE IF cond2 THEN Statement2 statement3
While Loop While condition do statement ; Statement condition False True Statement
Repeat-until Loop Repeat Statement; … Until condition ; Statement False True Statement
โครงสร้าง if-then-else คำสั่ง จริง เท็จ เงื่อนไข if false then jump to else_label then_actions jump to endif Else_label: else_actions endif: cmp al,10 jae abovenine mov dl,al add dl,’0’ jmp endif abovenine: add al,’A’-10 endif: if AL<10 then DL:=AL+’0’ else DL:=AL+’A’-10; EXAMPLE
โครงสร้าง repeat-until คำสั่ง เงื่อนไข เท็จ จริง startlabel: actions ... if false then jump to startlabel EXAMPLE startlabel: mov al,bl mul bl add dx,ax inc bl inc cx cmp dx,100 jbe startlabel repeat DX:=DX+BL*BL; BL:=BL+1; CX:=CX+1; until (DX>100);
โครงสร้าง while เท็จ เงื่อนไข จริง คำสั่ง startlabel: if false then jump to endlabel actions ... jump to startlabel endlabel: startloop: cmp dl,13 jz endloop cmp cx,20 jae endloop add al,dl adc ah,0 inc bx mov dl,data[bx] inc cx jmp startloop endloop: EXAMPLE while (DL<>13) and (CX<20) do begin AX:=AX+DL; BX:=BX+1; DL:=DATA[BX] CX:=CX+1; end;
โครงสร้าง for กำหนดค่าเริ่มต้น เท็จ ค่าของตัวแปร อยู่ในขอบเขต จริง set the value of CX startloop: actions . . . LOOP startloop เท็จ คำสั่ง ค่าของตัวแปร อยู่ในขอบเขต จริง กำหนดค่าเริ่มต้น ปรับค่าตัวแปร initialize index variable startloop: if index value is not in the range then jump to endloop action ... update index variable Jump to startloop endloop:
โครงสร้าง for mov cx,0 mov dl,1 startloop: cmp dl,100 ja endloop mov al,dl mov ah,0 mob bl,7 div bl cmp ah,0 jne endif inc cx endif: inc dl jmp startloop endloop: EXAMPLE CX:=0; for DL:=1 to 100 do begin if DL mod 7 = 0 then CX:=CX+1; end;
โครงสร้าง for ใช้คำสั่ง LOOP สะดวกกว่าในการสร้างวงรอบ แต่ไม่สามารถใช้ในการวนรอบที่ซับซ้อนได้ จึงนิยมใช้คำสั่ง JMP มากกว่า โครงสร้างการทำงานของคำสั่ง LOOPZ และ LOOPNZ มีลักษณะปนกันระหว่างโครงสร้าง for และ repeat EXAMPLE mov ax,0 mov cx,100 startloop: add ax,data[bx] add bx,2 cmp data[bx],0 looopnz startloop AX:=0; CX:=100; repeat AX:=AX+data[BX]; BX:=BX+2; CX:=CX-1; until (data[BX]=0) or (CX=0);
Example 1 Calculate the “n!” (n-factorial) Start Read “n” n := n -1 n > 0 Write “fac” End False True fac := fac * n
Example 2 Convert Celcius to Farenheit Celcius Farenheit 0.0 32.0 1.0 33.8 2.0 35.6 … … 99.0 210.2 100.0 212.0 Farenheit = Celcius * (9/5) + 32
Example 2 Convert Celcius to Farenheit Start Write heading cel <=100 Write output End False True Far := Cel * (9/ 5) + 32 Cel := Cel +1
โจทย์ จงเขียนโปรแกรมตรวจสอบเลขฐานสิบที่รับจากผู้ใช้ (ไม่เกิน 8 บิต) ว่าเป็นจำนวนเฉพาะหรือไม่ โดยแสดงข้อความ yes หรือ no อ่านตัวเลขฐานสิบจากผู้ใช้ ใช้บริการดอสหมายเลข 0Ah ในการอ่านข้อความ แปลงข้อความทั้ง 8 บิตให้เป็นตัวเลข ตรวจสอบว่าเป็นจำนวนเฉพาะหรือไม่ ใช้วิธีทดลองหาร
ตัวอย่าง - การคำนวณ ตัวอย่างการแปลง 123 = 1*102 + 2*10 + 3 = (((0*10 + 1) *10 + 2)*10 + 3) 0 * 10 + 1 * 10 + 2 + 3 .data maxlen db 4 strlen db ? str db 4 dup (?) .code mov ax,@data mov ds,ax mov dx,offset maxlen mov ah,0Ah int 21h 4 3 ‘1’ ‘2’ ‘3’ 13 maxlen strlen str
แปลงตัวเลข ทดสอบจำนวนเฉพาะ mov cl , al mov cl , strlen mov ch , 0 sub cx , 2 ;cx=al-2 mov dl , al mov bl , 2 primetest: mov al , dl mov ah , 0 div bl inc bl cmp ah , 0 loopnz primetest jz notprime ; print “yes” notprime: ; print “no” mov cl , strlen mov ch , 0 mov bx , offset str mov al , 0 extract: mov dh , 10 mul dh ;AX=AL*10 ;discard AH mov dl , [bx] sub dl , ’0’ add al , dl ;AL=AL+digit inc bx loop extract
โจทย์การบ้าน รับเลขฐาน 10 จากผู้ใช้มีค่าไม่เกิน 65535 (16-bit) และให้แยกตัวประกอบ จากนั้นให้หาผลบวกตัวประกอบเหล่านั้น ตัวอย่าง 100 => 2x2 + 5x5 = 29 3000 => 2x2x2 + 3 + 5x5x5 = 136 วิธีการ 1. รับอินพุต จากข้อความแปลงเป็นเลขฐาน 10 => DX:AX 2. แยกตัวประกอบ 3. หาคำตอบและแสดงผลลัพธ์เป็นข้อความ
Question ?