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