210 likes | 299 Views
โปรแกรมภาษาแอสเซมบลี้ (2). ธนาวินท์ รักธรรมานนท์ fengtwr@ku.ac.th. หัวข้อในวันนี้. รูปแบบในการประกาศข้อมูล การอ้างใช้ข้อมูลและตำแหน่งของข้อมูล การประกาศข้อมูลสำหรับการเรียกใช้งานบริการของ DOS หมายเลข 09h และ 0Ah. ตัวอย่างโปรแกรมภาษาแอสเซมบลี้.
E N D
โปรแกรมภาษาแอสเซมบลี้ (2) ธนาวินท์ รักธรรมานนท์ fengtwr@ku.ac.th
หัวข้อในวันนี้ • รูปแบบในการประกาศข้อมูล • การอ้างใช้ข้อมูลและตำแหน่งของข้อมูล • การประกาศข้อมูลสำหรับการเรียกใช้งานบริการของ DOS หมายเลข 09h และ 0Ah
ตัวอย่างโปรแกรมภาษาแอสเซมบลี้ตัวอย่างโปรแกรมภาษาแอสเซมบลี้ ; This program prints the message ”Hello world” dseg segment msg1 db ’Hello world’,10h,13h,’$’ dseg ends sseg segment stack db 100 dup (?) sseg ends cseg segment assume cs:cseg,ds:dseg,ss:sseg start: 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 cseg ends end start
รูปแบบโปรแกรมแบบใหม่ ; 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
ประเภทการบริการของ DOS • Function 01h : อ่านการกดปุ่มจากแป้นพิมพ์ AH = 01h AL = รหัสแอสกีของอักขระที่ผู้ใช้กด • Function 02h : แสดงตัวอักษรออกทางหน้าจอ AH = 02h DL = รหัสแอสกีของอักขระที่ต้องการแสดง • Function 05h : พิมพ์ตัวอักษรทางเครื่องพิมพ์ AH = 05h DL = รหัสแอสกีของอักขระที่ต้องการพิมพ์
ประเภทการบริการของ DOS • Function 07h : อ่านการกดแป้นพิมพ์ โดยไม่แสดงปุ่มที่กด (ไม่ตรวจการกด Ctrl-Break) AH = 07h AL = รหัสแอสกีของอักขระที่ผู้ใช้กด • Function 08h : อ่านการกดแป้นพิมพ์ โดยไม่แสดงปุ่มที่กด (ตรวจการกด Ctrl-Break) AH = 08h AL = รหัสแอสกีของอักขระที่ผู้ใช้กด
ประเภทการบริการของ DOS • Function 09h : แสดงข้อความทางหน้าจอ AH = 09h DS:DX = ตำแหน่งของข้อความที่ต้องการแสดง โดยข้อความนี้ต้องจบด้วยอักษร ‘$’ เท่านั้น • Function 0Ah : อ่านข้อความ AH = 0Ah DS:DX = ตำแหน่งของบัฟเฟอร์สำหรับเก็บข้อมูล • Function 4Ch : จบโปรแกรม AH = 4Ch AL = ค่าที่ต้องการคืนให้กับระบบ
การประกาศข้อมูลหรือตัวแปรการประกาศข้อมูลหรือตัวแปร • ข้อมูลที่โปรแกรมใช้และตัวแปรต่างๆ ที่อยู่ในหน่วยความจำ เป็นสิ่งเดียวกัน • การประกาศข้อมูล คือ • การระบุให้ assembler จองเนื้อที่ในหน่วยความจำไว้ใช้สำหรับการเก็บข้อมูล • และตั้งชื่อให้กับหน่วยความจำตำแหน่งนั้น (สร้างเลเบล)
จะเป็นการจองเนื้อที่ในหน่วยความจำขนาด 5 ไบต์ โดยจะมีเลเบล i j และ ch ชี้ตำแหน่งดังรูป i : j : ch : ตัวอย่างแนวคิดการจองพื้นที่ • ตัวอย่างการประกาศตัวแปร • เลขจำนวนเต็ม 16 บิต 2 ตัว (i, j) • อักขระ 1 ไบต์ (ch)
คำสั่งเทียมสำหรับการจองเนื้อที่ในหน่วยความจำคำสั่งเทียมสำหรับการจองเนื้อที่ในหน่วยความจำ • เราใช้คำสั่งเทียม Dxในการระบุกับ assembler ว่าจะต้องการหน่วยความจำขนาดหน่วยละเท่าใด • เราใช้ เครื่องหมาย ‘?’ ในการระบุการจองเนื้อที่หน่วยความจำ โดยไม่ระบุค่าของข้อมูล dseg segment data1 db 1,? data2 dw 1,2 data3 db ’Hi’,10,13 data4 dd 1234h dseg ends
data1 dseg : 0000 0001 0002 0003 0004 0005 01h db 1,? ? data2 01h dw 1,2 00h 02h 00h data3 48h 0006 0007 0008 0009 000A 000B 000C 000D db ’Hi’,10,13 69h 0Ah 0Dh data4 34h dd 1234h 12h 00h 00h dseg segment data1db1,? data2dw1,2 data3db’Hi’,10,13 data4dd1234h dseg ends
data7 ซ้ำ data8 ซ้ำ ซ้ำ data9 ซ้ำ data10 0 0 0 0 0 0 ซ้ำ 5 5 5 5 5 5 1 2 4 4 4 1 2 4 4 4 1 2 4 4 4 1 2 4 4 4 ? ? ? ? ? ? การระบุค่าของหน่วยความจำที่มีการซ้ำ • เราใช้คำสั่งเทียม dup ในการระบุค่าเริ่มต้นที่มีการซ้ำกันหลายชุด. • รูปแบบ จำนวนซ้ำdup(ค่าที่ซ้ำ) Data7 db 10 dup (0) Data8 db 5 dup (4 dup (5)) Data9 db 4 dup (1,2,3 dup (4)) Data10 db 20 dup (?)
data1 data2 00h 01h 22h 01h 01h 00h 23h 02h 11h 00h 48h data3 data4 69h 0Ah 0Dh 34h 12h 00h 00h การอ้างใช้ข้อมูลในหน่วยความจำ dseg segment data1 db 1,? data2 dw 1,2 data3 db ’Hi’,10,13 data4 dd 1234h dseg ends mov al,data1 mov bx,data2 mov data1,0 mov [data2+2],1123h mov data1[1],22h mov cl,byte ptr data4 AL = 01h BX = 01h CL = 34h
การอ้างใช้ข้อมูลในหน่วยความจำการอ้างใช้ข้อมูลในหน่วยความจำ • เราสามารถใช้เลเบลที่ประกาศแทนตำแหน่งของมูลในหน่วยความจำได้โดยตรง • เราสามารถอ้างหน่วยความจำโดยคิดระยะสัมพัทธ์กับตำแหน่งของเลเบลได้ โดยใช้รีจิสเตอร์ BX • สังเกตว่าในการกำหนดค่าคงที่ให้กับหน่วยความจำนั้น เราไม่ต้องระบุขนาดอีก เพราะเราระบุตอนประกาศแล้ว • ไม่จำเป็นต้องใช้ข้อมูลตามขนาดที่ระบุเสมอไป โดยเราสามารถระบุขนาดกำกับไปด้วย โดยคำสั่ง byte ptr
การอ้างใช้ข้อมูลในหน่วยความจำการอ้างใช้ข้อมูลในหน่วยความจำ • การอ้างตำแหน่งของข้อมูล • ใช้คำสั่งเทียม 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
01 DS:0000 02 AL = 01h DS:0001 BX = 0000h 03 DS:0003 CX = 0006h ? DS:0004 [DS:0004] = 06h [DS:0005] = 00h ? DS:0005 ? DS:0006 mov al,data1 05 DS:0007 00 mov bx,offset data1 DS:0008 06 mov cx,data3[2] DS:0009 00 mov bx,offset data2 mov [bx],cx DS:000A ตัวอย่างการอ้างใช้ข้อมูลในหน่วยความจำ dseg segment data1 db 1,2,3 data2 db 3 dup (?) data3 dw 5,6 dseg ends
การใช้บริการหมายเลข 09h ของ DOS บริการหมายเลข 09h : แสดงผลข้อความ • รับข้อมูลผ่านรีจิสเตอร์ดังนี้ • DS : DX = ตำแหน่งของข้อความที่จะแสดง โดยข้อความนี้ต้องจบด้วยเครื่องหมาย ‘$’ • AH = 09h dseg segment msg db ’hello’,10,13,’$’ dseg ends mov ah,9 mov dx,offset msg int 21h
การใช้บริการหมายเลข 0Ah ของ DOS บริการหมายเลข 0Ah : อ่านข้อความ • รับข้อมูลผ่านรีจิสเตอร์ดังนี้ • DS : DX = ตำแหน่งของหน่วยความจำที่จะใช้เก็บข้อมูล (บัฟเฟอร์) โดยที่จะต้องมีรูปแบบดังนี้ • ไบต์ที่ 1 : ความยาวของข้อมูลทั้งหมด (ต้องเผื่อที่ว่างไว้ 1 ไบต์สำหรับอักขระขึ้นบรรทัดใหม่) • ไบต์ที่ 2 : DOS จะใส่ความยาวข้อมูลจริงลงที่หน่วยความจำตำแหน่งนี้ • ไบต์ต่อ ๆ ไป : ข้อความที่อ่านได้ โดยต้องจองเนื้อที่หน่วยความจำให้เพียงพอ • AH = 0Ah .data maxlen db 30 ;29char+return msglen db ? msg db 30 dup (?)
การใช้บริการหมายเลข 0Ah ของ DOS • การเรียกใช้บริการอ่านข้อความ ต้องส่งแอดเดรสของบัฟเฟอร์ไปยัง DOS เราจะส่งตำแหน่งของ maxlen ไปให้ เพื่อให้รูปแบบของข้อมูลตรงตามข้อกำหนด • msglen จะเก็บความยาวของข้อความที่อ่านได้. • อักขระต่างในข้อความจะถูกเก็บในหน่วยความจำตั้งแต่ msg เป็นต้นไป บัฟเฟอร์ msg msglen maxlen
แบบฝึกหัด • โปรแกรมที่รับข้อความจากผู้ใช้แล้วแสดงข้อความนั้นออกมา • รับข้อความ ใช้บริการหมายเลข 0Ah • กำหนดความยาวสูงสุด • รับค่าความยาวจริง • รับข้อความ • แสดงข้อความ ใช้บริการหมายเลข 09h • ข้อความต้องจบด้วย ‘$’