โปรแกรมภาษาแอสเซมบลี้เบือ้ งต้ น ธนาวินท์ รักธรรมานนท์ [email protected] หัวข้อในวันนี้ รู ปแบบของโปรแกรมภาษาแอสเซมบลี้แบบเก่า รู ปแบบของโปรแกรมภาษาแอสเซมบลี้แบบใหม่ การเรี ยกใช้บริ การของ DOS ขั้นตอนการแปลโปรแกรม ตัวอย่างโปรแกรม.
Download ReportTranscript โปรแกรมภาษาแอสเซมบลี้เบือ้ งต้ น ธนาวินท์ รักธรรมานนท์ [email protected] หัวข้อในวันนี้ รู ปแบบของโปรแกรมภาษาแอสเซมบลี้แบบเก่า รู ปแบบของโปรแกรมภาษาแอสเซมบลี้แบบใหม่ การเรี ยกใช้บริ การของ DOS ขั้นตอนการแปลโปรแกรม ตัวอย่างโปรแกรม.
โปรแกรมภาษาแอสเซมบลี้เบือ้ งต้ น ธนาวินท์ รักธรรมานนท์ [email protected] หัวข้อในวันนี้ รู ปแบบของโปรแกรมภาษาแอสเซมบลี้แบบเก่า รู ปแบบของโปรแกรมภาษาแอสเซมบลี้แบบใหม่ การเรี ยกใช้บริ การของ DOS ขั้นตอนการแปลโปรแกรม ตัวอย่างโปรแกรม 2 รู ปแบบของโปรแกรมภาษาแอสเซมบลี้ การโปรแกรมภาษาแอสเซมบลี้จะเขียนโปรแกรมบน เซกเมนต์ต่าง ๆ การประกาศในเซกเมนต์ต่าง ๆ จะใช้สาหรับกาหนดข้อมูล, ขนาดของสแต็กซ์และคาสัง่ ในการโปรแกรม 3 ตัวอย่างโปรแกรมภาษาแอสเซมบลี้ ; This program prints the message ”Hello world” dseg msg1 dseg sseg sseg cseg segment db ’Hello world’,10h,13h,’$’ ends segment stack db 100 dup (?) ends segment assume cs:cseg,ds:dseg,ss:sseg start: cseg mov ax,dseg ;set DS mov ds,ax mov ah,9h ;print message mov dx,offset msg1 int 21h mov ax,4c00h ;exit program int 21h ends end start 4 คำสั่ งเทียม เป็ นคาสัง่ ที่ผเู ้ ขียนโปรแกรมเขียนเพื่อระบุให้ assembler แปล โปรแกรมในรู ปแบบที่ตอ้ งการ เป็ นคาสัง่ กลุ่มที่ไม่ปรากฏในรหัสคาสัง่ ภาษาเครื่ อง เช่น คาสัง่ segment , db , และ assume เป็ นต้น 5 กำรประกำศเซกเมนต์ ในโปรแกรมภาษาแอสเซมบลี้เราสามารถประกาศเซกเมนต์ได้โดย ใช้คาสัง่ เทียม segment การโปรแกรมทัว่ ไปจะประกาศเซกเมนต์ท้ งั สิ้ น 3 เซกเมนต์ • • • dseg ใช้ในการจองพื้นที่สาหรับตัวแปร sseg ใช้ในการจองพื้นที่สาหรับสแต็กซ์ cseg เป็ นเซกเมนต์หลักที่บรรจุชุดคาสั่งที่ใช้ในการประมวลผล segment_name segment …. segment_name ends 6 ตัวอย่ ำงโปรแกรมภำษำแอสเซมบลี้ ; This program prints the message ”Hello world” dseg msg1 dseg sseg sseg cseg segment db ’Hello world’,10h,13h,’$’ ends segment stack db 100 dup (?) ends segment assume cs:cseg,ds:dseg,ss:sseg start: cseg mov ax,dseg ;set DS mov ds,ax mov ah,9h ;print message mov dx,offset msg1 int 21h mov ax,4c00h ;exit program int 21h ends end start 7 กำรประกำศให้ assembler ทรำบกำรใช้ เซกเมนต์ คาสัง่ เทียม assume ใช้เพื่อระบุให้ assembler ทราบว่าเราจะใช้ เซกเมนต์ต่าง ๆ อย่างไร การระบุโดยวิธีน้ ี น้ น ั จะเป็ นการระบุให้ assembler นาไปแปล โปรแกรมได้ถกู ต้องเท่านั้น ไม่ ได้ ระบุให้ assembler ตั้งค่ ำเซกเมนต์ รีจิสเตอร์ ต่างๆ ให้ ดังนั้นเราจะต้องตั้งค่าให้กบั เซกเมนต์รีจิสเตอร์เอง 8 กำรประกำศให้ assembler ทรำบกำรใช้ เซกเมนต์ mov mov ax,dseg ds,ax เซกเมนต์ขอ้ มูล (DS) • จะต้องมีการกาหนดตาแหน่งเริ่ มต้นให้กบั DS ก่อนการใช้งานเสมอ เซกเมนต์คาสัง่ (CS) และแสต็กเซกเมนต์ (SS) • • • ระบบปฏิบตั ิการจะตั้งค่าของ CS และ SS ให้กบั โปรแกรมเมื่อเริ่ มทางาน ต้องระบุเซกเมนต์ที่จะใช้เป็ น stack โดยใช้คาสั่งเทียม stack หลังการ ประกาศเซกเมนต์ที่ตอ้ งการให้เป็ นแสต็ก เซกเมนต์คาสั่งระบบจะตั้งให้อตั โนมัติ 9 รู ปแบบโปรแกรม กำรประกำศจุดเริ่มโปรแกรม • กาหนดหลังคาสั่งเทียม end ในบรรทัดสุ ดท้ายโดยระบุดว้ ย label กำรประกำศเลเบล • การระบุตาแหน่งของหน่วยความจา ทาได้โดยการสร้างเลเบลที่บรรทัดนั้น • Assembler จะจดจาแอดเดรสของเลเบลต่าง ๆ และจะนาไปแทนค่าให้ตาม ความเหมาะสม label_name : กำรใส่ หมำยเหตุ • หลังเครื่ องหมาย ‘ ; ’ assembler จะถือว่าเป็ นหมายเหตุ 10 รู ปแบบโปรแกรม กำรสั่ งให้ โปรแกรมจบกำรทำงำน • ใช้บริ การหมายเลข 4Ch ของระบบปฏิบตั ิการ DOS โดยใช้คาสัง่ : mov int ax,4C00h 21h กำรใช้ บริกำรของระบบปฏิบัติกำร DOS • • สามารถใช้บริ การได้หลายรู ปแบบ โดยกาหนดประเภทใน AX และเรี ยกใช้คาสัง่ int 21h 11 ตัวอย่ ำงโปรแกรมภำษำแอสเซมบลี้ ; This program prints the message ”Hello world” dseg msg1 dseg sseg sseg cseg segment db ’Hello world’,10h,13h,’$’ ends segment stack db 100 dup (?) ends segment assume cs:cseg,ds:dseg,ss:sseg start: cseg mov ax,dseg ;set DS mov ds,ax mov ah,9h ;print message mov dx,offset msg1 int 21h mov ax,4c00h ;exit program int 21h ends end start 12 รู ปแบบโปรแกรมแบบใหม่ ; This program prints "Hello world" .model small .dosseg .data msg1 db ’Hello world’,10h,13h,’$’ .stack 100h .code start: mov ax,@data mov ds,ax mov ah,9h mov dx,offset msg1 int 21h mov ax,4c00h int 21h end start 13 รู ปแบบโปรแกรมแบบใหม่ เพื่อให้โปรแกรมสั้นและกะทัดรัดมากขึ้น ชื่อของ segment จะถูกประกาศให้โดยอัตโนมัติ ชื่อของเซกเมนต์ขอ้ มูลคือ @data แทน dseg การประกาศเซกเมนต์ไม่ตอ้ งมีคาสัง่ xseg ends จุดเริ่ มต้นของการทางานของโปรแกรมยังคงเริ่ มต้นที่เลเบลภายหลัง คาสัง่ end 14 รู ปแบบโปรแกรมแบบใหม่ ; This program prints "Hello world" .model small .dosseg .data msg1 db ’Hello world’,10h,13h,’$’ .stack 100h .code start: mov ax,@data mov ds,ax mov ah,9h mov dx,offset msg1 int 21h mov ax,4c00h int 21h end start 15 กำรเรียกใช้ บริกำรของ DOS ระบบปฏิบตั ิการ DOS ได้จดั เตรี ยมบริ การต่าง ๆ ให้ผเู ้ ขียนโปรแกรมเรี ยกใช้ได้ โดยผ่านทางการขัดจังหวะหมายเลข 21h ในการเรี ยกใช้บริ การของ DOS เราจะต้องกาหนดหมายเลขของบริ การลงใน รี จิสเตอร์ AH และกาหนดค่าพารามิเตอร์ต่างๆ ลงในรี จิสเตอร์ ใช้คาสัง่ INT 21h เพื่อเรี ยกใช้การบริ การของระบบ รู ปแบบโดยทัว่ ไปในการเรี ยกใช้บริ การ คือ ; set parameters mov int AH,function_number 21h 16 ประเภทกำรบริกำรของ DOS Function 01h : อ่ ำนกำรกดปุ่ มจำกแป้ นพิมพ์ AH = 01h AL = รหัสแอสกีของอักขระที่ผใู ้ ช้กด Function 02h : แสดงตัวอักษรออกทำงหน้ ำจอ AH = 02h DL = รหัสแอสกีของอักขระที่ตอ้ งการแสดง Function 05h : พิมพ์ตัวอักษรทำงเครื่องพิมพ์ AH = 05h DL = รหัสแอสกีของอักขระที่ตอ้ งการพิมพ์ 17 ประเภทกำรบริกำรของ DOS Function 07h : อ่ ำนกำรกดแป้ นพิมพ์ โดยไม่ แสดงปุ่ มทีก่ ด (ไม่ ตรวจกำรกด Ctrl-Break) AH = 07h AL = รหัสแอสกีของอักขระที่ผใู้ ช้กด Function 08h : อ่ ำนกำรกดแป้ นพิมพ์ โดยไม่ แสดงปุ่ มทีก่ ด (ตรวจกำรกด Ctrl-Break) AH = 08h AL = รหัสแอสกีของอักขระที่ผใู ้ ช้กด 18 ประเภทกำรบริกำรของ DOS Function 09h : แสดงข้ อควำมทำงหน้ ำจอ AH = 09h DS:DX = ตาแหน่งของข้อความที่ตอ้ งการแสดง โดยข้อความนี้ตอ้ งจบด้วยอักษร ‘$’ เท่านั้น Function 0Ah : อ่ำนข้ อควำม AH = 0Ah DS:DX = ตาแหน่งของบัฟเฟอร์สาหรับเก็บข้อมูล Function 4Ch : จบโปรแกรม AH = 4Ch AL = ค่าที่ตอ้ งการคืนให้กบั ระบบ 19 ขั้นตอนกำรพัฒนำโปรแกรม … mov add sub push … สร้างโปรแกรมเก็บไว้ในแฟ้ มนำมสกุล ASM ใช้โปรแกรม assembler เช่น MASM หรื อ TASM แปลโปรแกรมเป็ นแฟ้ ม เป้ าหมาย (Object file) โดยใช้คาสัง่ MASM filename; ใช้โปรแกรม LINK เพื่อเชื่อมโยงแฟ้ มเป้ าหมายแฟ้ มเดียวหรื อหลายแฟ้ มเข้า ด้วยกัน โดยใช้คาสัง่ LINK filename; .ASM A, B B,A A, B A Assembler Linker .ASM .ASM Hello 20 ตัวอย่ ำงโปรแกรม 1 อ่านตัวอักษรจากผูใ้ ช้แล้วแสดงตัวอักษรนั้นออกมา .model small .dosseg .stack 100h .code start: mov int end ah,01h 21h ;read character (Func 01h) mov mov int dl,al ah,02h 21h ;copy character to DL ;display it (Func 02h) mov int start ax,4C00h ;Exit (Function 4Ch) 21h 21 ตัวอย่ ำงโปรแกรม 2 อ่านตัวอักษรจากผูใ้ ช้แล้วแสดงตัวอักษรตัวถัดไปออกมา sseg sseg cseg segment stack db 100 dup (?) ends segment assume cs:cseg,ss:sseg start: cseg mov int ah,01h 21h ;read character (Func 01h) mov inc mov int dl,al dl ah,02h 21h ;copy to DL ;increse DL (next char.) ;display it (Func 02h) mov int ends end ax,4C00h 21h ;Exit start 22 ตัวอย่ ำงโปรแกรม 3 อ่านตัวอักษรพิมพ์เล็กจากผูใ้ ช้แล้วแสดงตัวอักษรพิมพ์ให่่ .model small .dosseg .stack 100h .code start: mov int end ah,01h 21h mov sub mov int dl,al dl,32 ah,02h 21h mov int start ax,4C00h 21h ;read char. ;change char. case ;display it ;exit 23 ตัวอย่ ำงโปรแกรม 4 อ่านตัวอักษรพิมพ์เล็กจากผูใ้ ช้แล้วแสดงตัวอักษรพิมพ์ให่่โดยไม่ แสดงอักษรที่ผใู้ ช้กดให้เห็น sseg sseg cseg start: cseg segment db ends segment assume mov int mov sub mov int mov int ends end stack 100 dup (?) cs:cseg,ss:sseg ah,08h ;readchar(Func 08h) 21h dl,al ;Change case dl,32 ah,02h 21h ax,4C00h ;exit 21h start 24 ตัวอย่ ำงโจทย์ รับการกดปุ่ มจากผูใ้ ช้แล้วแสดงค่ารหัสแอสกีของอักขระที่ผใู ้ ช้กดเป็ นเลขฐาน 10 (เพื่อความง่าย : ให้แสดงเป็ นตัวเลข 3 หลักเสมอ) ขั้นตอน • รับการกดปุ่ ม • ใช้ Function 01h • คานวณเลขในแต่ละหลักของรหัสแอสกี • แสดงเลขในแต่ละหลักออกมา • ใช้คาสัง่ ทางคณิตศาสตร์ • ใช้ Function 02h 25 .model small .dosseg .stack .code start: mov int mov mov div mov mov div mov mov 100h ah,01h 21h ah,0 bl,10 bl cl,ah ah,0 bl ch,ah dh,al ;read character ;ASCII -> AL ;last digit->cl ;2nd digit->ch ;1st digit->dh mov mov int mov int ah,02h dl,10 21h dl,13 21h ;disp newline ;LF mov mov add int ah,02h dl,dh dl,'0' 21h ;display ascii ;1st digit mov add int dl,ch dl,'0' 21h ;2nd digit mov add int dl,cl dl,'0' 21h ;3rd digit mov int ax,4C00h 21h end ;CR start 26 Question ? 27