โปรแกรมภาษาแอสเซมบลี้ (2) ธนาวินท์ รักธรรมานนท์ [email protected] หัวข้อในวันนี้ รู ปแบบในการประกาศข้อมูล การอ้างใช้ขอ ้ มูลและตาแหน่งของข้อมูล การประกาศข้อมูลสาหรับการเรี ยกใช้งานบริ การของ DOS หมายเลข 09h และ 0Ah
Download ReportTranscript โปรแกรมภาษาแอสเซมบลี้ (2) ธนาวินท์ รักธรรมานนท์ [email protected] หัวข้อในวันนี้ รู ปแบบในการประกาศข้อมูล การอ้างใช้ขอ ้ มูลและตาแหน่งของข้อมูล การประกาศข้อมูลสาหรับการเรี ยกใช้งานบริ การของ DOS หมายเลข 09h และ 0Ah
โปรแกรมภาษาแอสเซมบลี้ (2) ธนาวินท์ รักธรรมานนท์ [email protected] หัวข้อในวันนี้ รู ปแบบในการประกาศข้อมูล การอ้างใช้ขอ ้ มูลและตาแหน่งของข้อมูล การประกาศข้อมูลสาหรับการเรี ยกใช้งานบริ การของ DOS หมายเลข 09h และ 0Ah 2 ตัวอย่างโปรแกรมภาษาแอสเซมบลี้ ; 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 3 รู ปแบบโปรแกรมแบบใหม่ ; 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 4 ประเภทการบริการของ DOS Function 01h : อ่ านการกดปุ่ มจากแป้ นพิมพ์ AH = 01h AL = รหัสแอสกีของอักขระที่ผใู ้ ช้กด Function 02h : แสดงตัวอักษรออกทางหน้ าจอ AH = 02h DL = รหัสแอสกีของอักขระที่ตอ้ งการแสดง Function 05h : พิมพ์ตัวอักษรทางเครื่องพิมพ์ AH = 05h DL = รหัสแอสกีของอักขระที่ตอ้ งการพิมพ์ 5 ประเภทการบริการของ DOS Function 07h : อ่ านการกดแป้ นพิมพ์ โดยไม่ แสดงปุ่ มทีก่ ด (ไม่ ตรวจการกด Ctrl-Break) AH = 07h AL = รหัสแอสกีของอักขระที่ผใู้ ช้กด Function 08h : อ่ านการกดแป้ นพิมพ์ โดยไม่ แสดงปุ่ มทีก่ ด (ตรวจการกด Ctrl-Break) AH = 08h AL = รหัสแอสกีของอักขระที่ผใู ้ ช้กด 6 ประเภทการบริการของ DOS Function 09h : แสดงข้ อความทางหน้ าจอ AH = 09h DS:DX = ตาแหน่งของข้อความที่ตอ้ งการแสดง โดยข้อความนี้ตอ้ งจบด้วยอักษร ‘$’ เท่านั้น Function 0Ah : อ่านข้ อความ AH = 0Ah DS:DX = ตาแหน่งของบัฟเฟอร์สาหรับเก็บข้อมูล Function 4Ch : จบโปรแกรม AH = 4Ch AL = ค่าที่ตอ้ งการคืนให้กบั ระบบ 7 การประกาศข้ อมูลหรือตัวแปร ข้อมูลที่โปรแกรมใช้และตัวแปรต่างๆ ที่อยูใ่ นหน่วยความจา เป็ นสิ่ งเดียวกัน การประกาศข้อมูล คือ • การระบุให้ assembler จองเนื้อที่ในหน่วยความจาไว้ใช้ สาหรับการเก็บข้อมูล • และตั้งชื่อให้กบั หน่วยความจาตาแหน่งนั้น (สร้างเลเบล) 8 ตัวอย่ างแนวคิดการจองพืน้ ที่ ตัวอย่างการประกาศตัวแปร • เลขจานวนเต็ม 16 บิต 2 ตัว (i, j) • อักขระ 1 ไบต์ (ch) i: j: ch : จะเป็ นการจองเนื้อที่ ในหน่วยความจา ขนาด 5 ไบต์ โดยจะ มีเลเบล i j และ ch ชี้ตาแหน่งดังรู ป 9 คาสั่ งเทียมสาหรับการจองเนือ้ ที่ในหน่ วยความจา เราใช้คาสัง่ เทียม Dx ในการระบุกบั assembler ว่าจะต้องการ หน่วยความจาขนาดหน่วยละเท่าใด เราใช้ เครื่องหมาย ‘?’ ในการระบุการจองเนื้อที่หน่วยความจา โดยไม่ ระบุค่าของข้อมูล คาสั่ ง ความหมาย dseg data1 data2 data3 data4 dseg segment db 1,? dw 1,2 db ’Hi’,10,13 dd 1234h ends ขนาด (ไบต์ ) DB Define Byte 1 DW Define Word 2 DD Define Double 4 DQ Define Quad word 8 DT Define Ten byte 10 10 dseg : 0000 0001 0002 0003 dseg segment 0004 data1 db 1,? 0005 data2 dw 1,2 0006 data3 db ’Hi’,10,13 data4 dd 1234h 0007 dseg ends 0008 0009 000A 000B 000C 000D 01h ? 01h 00h 02h 00h 48h 69h 0Ah 0Dh 34h 12h 00h 00h data1 db 1,? data2 dw 1,2 data3 db ’Hi’,10,13 data4 dd 1234h 11 การระบุค่าของหน่ วยความจาทีม่ ีการซ้า เราใช้คาสัง่ เทียม dup ในการระบุค่าเริ่ มต้นที่มีการซ้ ากันหลายชุด. รู ปแบบ จานวนซ้า dup (ค่ าที่ซ้า) Data7 db 10 dup (0) data7 data8 Data8 db Data9 db 5 dup (4 dup (5)) data9 4 dup (1,2,3 dup (4)) data10 Data10 db 20 dup (?) 0 0 0 0 0 5 5 5 5 5 ซ้ำ ซ้ำ ซ้ำ 0 5 1 2 4 4 4 1 2 4 4 4 1 2 4 4 4 1 2 4 4 4 ซ้ำ ? ? ? ? ? ซ้ำ ? 12 การอ้ างใช้ ข้อมูลในหน่ วยความจา data1 data2 data3 data4 01h 00h 01h 22h 01h 00h 02h 23h 00h 11h 48h 69h 0Ah 0Dh 34h 12h 00h 00h dseg data1 data2 data3 data4 dseg mov mov mov mov mov mov segment db 1,? dw 1,2 db ’Hi’,10,13 dd 1234h ends al,data1 bx,data2 data1,0 [data2+2],1123h data1[1],22h cl,byte ptr data4 AL = 01h BX = 01h CL = 34h 13 การอ้ างใช้ ข้อมูลในหน่ วยความจา เราสามารถใช้เลเบลที่ประกาศแทนตาแหน่งของมูลในหน่วยความจา ได้โดยตรง เราสามารถอ้างหน่วยความจาโดยคิดระยะสั มพัทธ์ กบั ตาแหน่งของเล เบลได้ โดยใช้รีจิสเตอร์ BX สังเกตว่าในการกาหนดค่าคงที่ให้กบั หน่วยความจานั้น เราไม่ตอ้ ง ระบุขนาดอีก เพราะเราระบุตอนประกาศแล้ว ไม่จาเป็ นต้องใช้ขอ้ มูลตามขนาดที่ระบุเสมอไป โดยเราสามารถระบุ ขนาดกากับไปด้วย โดยคาสัง่ byte ptr 14 การอ้ างใช้ ข้อมูลในหน่ วยความจา การอ้างตาแหน่งของข้อมูล • ใช้คาสัง่ เทียม OFFSET การใช้รีจิสเตอร์ BX ในการอ้าง ตาแหน่งข้อมูล • • ใช้ BX เก็บออฟเซ็ตของ DATA7 ไว้ จากนั้นเราอ้างใช้หน่วยความจา เทียบกับ BX ใช้หน่วยความจาเทียบกับ DATA7 และค่าในBX mov ax,data2 mov bx,offset data2 mov bx , offset data7 mov byte ptr [bx] ,10 mov byte ptr [bx+1] ,20 mov bx , 2 mov data7[bx] ,30 mov data7[bx+1] ,40 15 ตัวอย่ างการอ้ างใช้ ข้อมูลในหน่ วยความจา 01 DS:0000 02 DS:0001 03 DS:0003 ? DS:0004 ? DS:0005 ? DS:0006 05 DS:0007 00 DS:0008 06 DS:0009 00 DS:000A dseg data1 data2 data3 dseg mov mov mov mov mov segment db 1,2,3 db 3 dup (?) dw 5,6 ends AL = 01h BX = 0000h CX = 0006h [DS:0004] = 06h [DS:0005] = 00h al,data1 bx,offset data1 cx,data3[2] bx,offset data2 [bx],cx 16 การใช้ บริการหมายเลข 09h ของ DOS บริ การหมายเลข 09h : แสดงผลข้อความ รับข้อมูลผ่านรี จิสเตอร์ดงั นี้ • DS : DX = ตาแหน่งของข้อความที่จะแสดง • AH = 09h โดยข้อความนี้ตอ้ งจบด้วยเครื่ องหมาย ‘$’ dseg msg dseg segment db ’hello’,10,13,’$’ ends mov mov int ah,9 dx,offset msg 21h 17 การใช้ บริการหมายเลข 0Ah ของ DOS บริ การหมายเลข 0Ah : อ่านข้อความ รับข้อมูลผ่านรี จิสเตอร์ดงั นี้ • DS : DX = ตาแหน่งของหน่วยความจาที่จะใช้เก็บข้อมูล (บัฟเฟอร์) โดยที่ จะต้องมีรูปแบบดังนี้ • • • • ไบต์ ที่ 1 : ความยาวของข้ อมูลทั้งหมด (ต้องเผื่อที่วา่ งไว้ 1 ไบต์สาหรับอักขระขึ้นบรรทัดใหม่) ไบต์ ที่ 2 : DOS จะใส่ ความยาวข้ อมูลจริงลงที่หน่วยความจาตาแหน่งนี้ ไบต์ ต่อ ๆ ไป : ข้ อความที่อ่านได้ โดยต้องจองเนื้อที่หน่วยความจาให้เพียงพอ AH = 0Ah .data maxlen db 30 ;29char+return msglen db ? msg db 30 dup (?) 18 การใช้ บริการหมายเลข 0Ah ของ DOS การเรี ยกใช้บริ การอ่านข้อความ ต้องส่ งแอดเดรสของบัฟเฟอร์ไปยัง DOS เราจะส่ งตาแหน่งของ maxlen ไปให้ เพื่อให้รูปแบบของ ข้อมูลตรงตามข้อกาหนด msglen จะเก็บความยาวของข้อความที่อ่านได้. อักขระต่างในข้อความจะถูกเก็บในหน่วยความจาตั้งแต่ msg เป็ น msg บัฟเฟอร์ ต้นไป msglen maxlen 19 แบบฝึ กหัด โปรแกรมที่รับข้อความจากผูใ้ ช้แล้วแสดงข้อความนั้นออกมา • รับข้อความ ใช้บริ การหมายเลข 0Ah • กาหนดความยาวสูงสุด • รับค่าความยาวจริ ง • รับข้อความ • แสดงข้อความ ใช้บริ การหมายเลข 09h • ข้อความต้องจบด้วย ‘$’ 20 Question ? 21