โปรแกรมภาษาแอสเซมบลี้เบื้องต้น

Slides:



Advertisements
งานนำเสนอที่คล้ายกัน
บทที่ 11 โปรแกรมย่อยขั้นต้น
Advertisements

Chapter 8 : Logic Modeling & Data Modeling
CS Assembly Language Programming
CS Assembly Language Programming
CS Assembly Language Programming
CS Assembly Language Programming
CS Assembly Language Programming Period 35.
CS Assembly Language Programming
CS Assembly Language Programming Period 16.
เฉลย Lab 10 Loop.
Repetitive Instruction
คำสั่งเงื่อนไขและการควบคุม
ขั้นตอนการแปลงไฟล์.
Control Transfer Instructions
Addressing Modes Assembly Programming.
BIT & STRING OPERATIONS
Arithmetic Instruction
Computer Architecture and Assembly Language
CS Assembly Language Programming
CS Assembly Language Programming Period 7.
CS Assembly Language Programming
CS Assembly Language Programming Period 33.
CS Assembly Language Programming Period 17.
COS2014: Assembly Language Programming
แบบฝึกหัด 24/12/09. เมื่อคอมพ์ทำคำสั่งต่อไปนี้ จงแสดง ผลลัพธ์และ ค่าแฟลกต่างๆ InstructionResult Z-FlagC-FlagP- Flag S- Flag O- Flag MOV AL,3h Inc AL Mov.
บทที่ 15 โปรแกรมย่อยและแสต็ก
บทที่ 17 คำสั่งตารางและการสร้างแมคโคร
บทที่ 10 โครงสร้างควบคุม
ธนาวินท์ รักธรรมานนท์
ธนาวินท์ รักธรรมานนท์
โปรแกรมภาษาแอสเซมบลี้ (2)
Javascripts.
ภาควิชาวิทยาศาสตร์ประยุกต์ คณะวิทยาศาสตร์เทคโนโลยีและการเกษตร
Debug #2 โครงสร้างคอมพิวเตอร์ และภาษาแอสเซมบลี้
เซกเมนต์ (Segment) โครงสร้างคอมพิวเตอร์ และภาษาแอสเซมบลี้
อินเทอร์รัพท์ (Interrupt)
คำสั่งควบคุมการทำงานของ ActionScripts
CS Assembly Language Programming
2.3.1 รหัสเทียม (Pseudo code)
การกระโดดและการวนรอบ
คำสั่งแบบมีเงื่อนไข Conditional Statements
Introduction to Computer Organization and Architecture Flow of Control ภาษาเครื่อง สายงานของการ ควบคุม.
1 exit() and break C++ provides a way to leave a program early (before its natural finish) with the exit() function. The format of exit() is as follows:
โครงสร้างภาษาซี C ++ structure
Introduction to Computer organization & Assembly Language
หลักการโปรแกรม อ.ธนากร อุยพานิชย์.
การประมวลผลแบบวน ( LOOP )
C Programming By Mr. Sanae Sukprung.
Chapter 4 ข้อความสั่ง เลือกทำ.
Concept of Programing.
INC 161 , CPE 100 Computer Programming
ภาษา C เบื้องต้น.
การแสดงขั้นตอนวิธีด้วยรหัสเทียม (Pseudo-Code)
Computer Programming การเขียนโปรแกรมคอมพิวเตอร์
โครงสร้างโปรแกรมภาษา C
Computer Programming การเขียนโปรแกรมคอมพิวเตอร์
คำอธิบายรายวิชา การเขียนผังงาน รหัสเทียม ตรรกศาสตร์เบื้องต้น การเขียนโปรแกรมคอมพิวเตอร์แบบโครงสร้าง ชนิดตัวแปร ตัวดำเนินการทางตรรกะ ตัวดำเนินการเปรียบเทียบ.
PHP (2) - condition - loop
ระบบเลขฐาน.
บทที่ 4 ตัวแปร (Variables)
บทที่ 2 ขั้นตอนการทำงาน (Algorithm)
การออกแบบระบบ System Design.
Principles of Problem Solving and Basic Programming หลักการแก้ปัญหาและการเขียนโปรแกรมเบื้องต้น2(1-2-3) สัปดาห์ที่ 13 การเขียนรหัสเทียม (Pseudo Code)
Microcomputer and Assembly Language
บทที่ 7 การเขียนโปรแกรม แบบวนรอบทำซ้ำ (Loop) Part1
การเขียนโปรแกรมคอมพิวเตอร์
บทที่ 7 การเขียนโปรแกรม แบบวนรอบทำซ้ำ (Loop) Part2
ระบบตัวเลข, Machine code, และ Register
การเขียนโปรแกรมภาษา Java (ต่อ)
โครงสร้างของโปรแกรมเกมคอมพิวเตอร์
ใบสำเนางานนำเสนอ:

โปรแกรมภาษาแอสเซมบลี้เบื้องต้น

หัวข้อในวันนี้ รูปแบบของโปรแกรมภาษาแอสเซมบลี้แบบเก่า รูปแบบของโปรแกรมภาษาแอสเซมบลี้แบบใหม่ การเรียกใช้บริการของ DOS ขั้นตอนการแปลโปรแกรม ตัวอย่างโปรแกรม

รูปแบบของโปรแกรมภาษาแอสเซมบลี้ การโปรแกรมภาษาแอสเซมบลี้จะเขียนโปรแกรมบนเซกเมนต์ต่าง ๆ การประกาศในเซกเมนต์ต่าง ๆ จะใช้สำหรับกำหนดข้อมูล, ขนาดของสแต็กซ์และคำสั่งในการโปรแกรม

ตัวอย่างโปรแกรมภาษาแอสเซมบลี้ ; 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

คำสั่งเทียม เป็นคำสั่งที่ผู้เขียนโปรแกรมเขียนเพื่อระบุให้ assembler แปลโปรแกรมในรูปแบบที่ต้องการ เป็นคำสั่งกลุ่มที่ไม่ปรากฏในรหัสคำสั่งภาษาเครื่อง เช่น คำสั่ง segment , db , และ assume เป็นต้น

การประกาศเซกเมนต์ ในโปรแกรมภาษาแอสเซมบลี้เราสามารถประกาศเซกเมนต์ได้โดยใช้คำสั่งเทียม segment การโปรแกรมทั่วไปจะประกาศเซกเมนต์ทั้งสิ้น 3 เซกเมนต์ dseg ใช้ในการจองพื้นที่สำหรับตัวแปร sseg ใช้ในการจองพื้นที่สำหรับสแต็กซ์ cseg เป็นเซกเมนต์หลักที่บรรจุชุดคำสั่งที่ใช้ในการประมวลผล segment_name segment …. segment_name ends

ตัวอย่างโปรแกรมภาษาแอสเซมบลี้ ; 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

การประกาศให้ assembler ทราบการใช้เซกเมนต์ คำสั่งเทียม assume ใช้เพื่อระบุให้ assembler ทราบว่าเราจะใช้เซกเมนต์ต่าง ๆ อย่างไร การระบุโดยวิธีนี้นั้นจะเป็นการระบุให้ assembler นำไปแปลโปรแกรมได้ถูกต้องเท่านั้น ไม่ได้ระบุให้ assembler ตั้งค่าเซกเมนต์รีจิสเตอร์ต่างๆ ให้ ดังนั้นเราจะต้องตั้งค่าให้กับเซกเมนต์รีจิสเตอร์เอง

การประกาศให้ assembler ทราบการใช้เซกเมนต์ mov ax,dseg mov ds,ax เซกเมนต์ข้อมูล (DS) จะต้องมีการกำหนดตำแหน่งเริ่มต้นให้กับ DS ก่อนการใช้งานเสมอ เซกเมนต์คำสั่ง (CS) และแสต็กเซกเมนต์ (SS) ระบบปฏิบัติการจะตั้งค่าของ CS และ SS ให้กับโปรแกรมเมื่อเริ่มทำงาน ต้องระบุเซกเมนต์ที่จะใช้เป็น stack โดยใช้คำสั่งเทียม stack หลังการประกาศเซกเมนต์ที่ต้องการให้เป็นแสต็ก เซกเมนต์คำสั่งระบบจะตั้งให้อัตโนมัติ

รูปแบบโปรแกรม การประกาศจุดเริ่มโปรแกรม การประกาศเลเบล การใส่หมายเหตุ กำหนดหลังคำสั่งเทียม end ในบรรทัดสุดท้ายโดยระบุด้วย label การประกาศเลเบล การระบุตำแหน่งของหน่วยความจำ ทำได้โดยการสร้างเลเบลที่บรรทัดนั้น Assembler จะจดจำแอดเดรสของเลเบลต่าง ๆ และจะนำไปแทนค่าให้ตามความเหมาะสม การใส่หมายเหตุ หลังเครื่องหมาย ‘ ; ’ assembler จะถือว่าเป็นหมายเหตุ label_name :

รูปแบบโปรแกรม การสั่งให้โปรแกรมจบการทำงาน ใช้บริการหมายเลข 4Ch ของระบบปฏิบัติการ DOS โดยใช้คำสั่ง : การใช้บริการของระบบปฏิบัติการ DOS สามารถใช้บริการได้หลายรูปแบบ โดยกำหนดประเภทใน AX และเรียกใช้คำสั่ง int 21h mov ax,4C00h int 21h

ตัวอย่างโปรแกรมภาษาแอสเซมบลี้ ; 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

รูปแบบโปรแกรมแบบใหม่ ; 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 end start

รูปแบบโปรแกรมแบบใหม่ เพื่อให้โปรแกรมสั้นและกะทัดรัดมากขึ้น ชื่อของ segment จะถูกประกาศให้โดยอัตโนมัติ ชื่อของเซกเมนต์ข้อมูลคือ @data แทน dseg การประกาศเซกเมนต์ไม่ต้องมีคำสั่ง xseg ends จุดเริ่มต้นของการทำงานของโปรแกรมยังคงเริ่มต้นที่เลเบลภายหลังคำสั่ง end

รูปแบบโปรแกรมแบบใหม่ ; 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 end start

การเรียกใช้บริการของ DOS ระบบปฏิบัติการ DOS ได้จัดเตรียมบริการต่าง ๆ ให้ผู้เขียนโปรแกรมเรียกใช้ได้โดยผ่านทางการขัดจังหวะหมายเลข 21h ในการเรียกใช้บริการของ DOS เราจะต้องกำหนดหมายเลขของบริการลงในรีจิสเตอร์ AH และกำหนดค่าพารามิเตอร์ต่างๆ ลงในรีจิสเตอร์ ใช้คำสั่ง INT 21h เพื่อเรียกใช้การบริการของระบบ รูปแบบโดยทั่วไปในการเรียกใช้บริการ คือ ; set parameters mov AH,function_number int 21h

ประเภทการบริการของ 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

ประเภทการบริการของ DOS Function 09h : แสดงข้อความทางหน้าจอ AH = 09h DS:DX = ตำแหน่งของข้อความที่ต้องการแสดง โดยข้อความนี้ต้องจบด้วยอักษร ‘$’ เท่านั้น Function 0Ah : อ่านข้อความ AH = 0Ah DS:DX = ตำแหน่งของบัฟเฟอร์สำหรับเก็บข้อมูล Function 4Ch : จบโปรแกรม AH = 4Ch AL = ค่าที่ต้องการคืนให้กับระบบ

ขั้นตอนการพัฒนาโปรแกรม สร้างโปรแกรมเก็บไว้ในแฟ้มนามสกุล ASM ใช้โปรแกรม assembler เช่น MASM หรือ TASM แปลโปรแกรมเป็นแฟ้มเป้าหมาย (Object file) โดยใช้คำสั่ง MASM filename; ใช้โปรแกรม LINK เพื่อเชื่อมโยงแฟ้มเป้าหมายแฟ้มเดียวหรือหลายแฟ้มเข้าด้วยกัน โดยใช้คำสั่ง LINK filename; Linker .ASM … mov A, B add B , A sub A, B push A Assembler .ASM Hello .ASM

ตัวอย่างโปรแกรม 1 อ่านตัวอักษรจากผู้ใช้แล้วแสดงตัวอักษรนั้นออกมา .model small .dosseg .stack 100h .code start: mov ah,01h ;read character (Func 01h) int 21h mov dl,al ;copy character to DL mov ah,02h ;display it (Func 02h) mov ax,4C00h ;Exit (Function 4Ch) end start

ตัวอย่างโปรแกรม 2 อ่านตัวอักษรจากผู้ใช้แล้วแสดงตัวอักษรตัวถัดไปออกมา sseg segment stack db 100 dup (?) sseg ends cseg segment assume cs:cseg,ss:sseg start: mov ah,01h ;read character (Func 01h) int 21h mov dl,al ;copy to DL inc dl ;increse DL (next char.) mov ah,02h ;display it (Func 02h) mov ax,4C00h ;Exit cseg ends end start

ตัวอย่างโปรแกรม 3 อ่านตัวอักษรพิมพ์เล็กจากผู้ใช้แล้วแสดงตัวอักษรพิมพ์ใหญ่ .model small .dosseg .stack 100h .code start: mov ah,01h ;read char. int 21h mov dl,al sub dl,32 ;change char. case mov ah,02h ;display it mov ax,4C00h ;exit end start

ตัวอย่างโปรแกรม 4 อ่านตัวอักษรพิมพ์เล็กจากผู้ใช้แล้วแสดงตัวอักษรพิมพ์ใหญ่โดยไม่แสดงอักษรที่ผู้ใช้กดให้เห็น sseg segment stack db 100 dup (?) sseg ends cseg segment assume cs:cseg,ss:sseg start: mov ah,08h ;readchar(Func 08h) int 21h mov dl,al ;Change case sub dl,32 mov ah,02h mov ax,4C00h ;exit cseg ends end start

ตัวอย่างโจทย์ รับการกดปุ่มจากผู้ใช้แล้วแสดงค่ารหัสแอสกีของอักขระที่ผู้ใช้กดเป็นเลขฐาน 10 (เพื่อความง่าย : ให้แสดงเป็นตัวเลข 3 หลักเสมอ) ขั้นตอน รับการกดปุ่ม ใช้ Function 01h คำนวณเลขในแต่ละหลักของรหัสแอสกี ใช้คำสั่งทางคณิตศาสตร์ แสดงเลขในแต่ละหลักออกมา ใช้ Function 02h

mov ah,02h ;disp newline .model small mov dl,10 ;LF .dosseg int 21h .stack 100h .code start: mov ah,01h ;read character int 21h ;ASCII -> AL mov ah,0 mov bl,10 div bl mov cl,ah ;last digit->cl mov ch,ah ;2nd digit->ch mov dh,al ;1st digit->dh mov ah,02h ;disp newline mov dl,10 ;LF int 21h mov dl,13 ;CR mov ah,02h ;display ascii mov dl,dh ;1st digit add dl,'0' mov dl,ch add dl,'0' ;2nd digit mov dl,cl add dl,'0' ;3rd digit mov ax,4C00h end start

การกระโดดและการวนรอบ

คำสั่งกระโดด Jxx label คำสั่งกระโดดมี 3 รูปแบบ คำสั่งกระโดดแบบไม่มีเงื่อนไข คำสั่งกระโดดแบบมีเงื่อนไขตามแฟล็กซ์ คำสั่งกระโดดแบบมีเงื่อนไขตามค่าในรีจิสเตอร์ Jxx label MOV AX, 01H ADD AX, BX CMP AX, 0 JZ TRUE JNZ FALSE TRUE : INC AX FALSE : INC CX AX := BX + 1; IF AX = 0 THEN AX:=AX+1; CX := CX + 1;

คำสั่งกระโดด นิยมใช้คู่กับคำสั่งทางคณิตศาสตร์โดยเฉพาะคำสั่งเปรียบเทียบ (CMP) ข้อมูลที่นำมาเปรียบเทียบเป็นข้อมูลชนิดตัวเลขเสมอ แต่คำสั่งกระโดดรองรับได้ทั้งตัวเลขแบบคิดเครื่องหมายและไม่คิดเครื่องหมาย การกระโดดทุกครั้งสามารถกระโดดไปที่เลเบลเท่านั้น ไม่สามารถกระโดดไปที่หมายเลขบรรทัดได้ การกำหนดเลเบลต้องกำหนดที่ต้นบรรทัดเท่านั้น

คำสั่งการกระโดดเบื้องต้น JMP <เลเบล> กระโดดข้ามไปที่ <เลเบล> อย่างไม่มีเงื่อนไข JZ (JE) <เลเบล> กระโดดข้ามไปที่ <เลเบล> เมื่อผลของคำสั่งทางคณิตศาสตร์ล่าสุดที่ผ่านมาเป็นศูนย์ JNZ (JNE) <เลเบล> กระโดดข้ามไปที่ <เลเบล> เมื่อผลของคำสั่งทางคณิตศาสตร์ล่าสุดที่ผ่านมาไม่เป็นศูนย์

คำสั่งกระโดด (ตัวเลขไม่มีเครื่องหมาย) เงื่อนไขการกระโดด แฟล็กทดสอบ JA (JNBE) Above CF = 0 , ZF = 0 JB (JNAE) Below CF = 1 , ZF = 0 JAE (JNB) Above or Equal Zero CF = 0 , ZF = 1 JBE (JNA) Below or Equal Zero CF = 1 , ZF = 1

คำสั่งกระโดด (ตัวเลขมีเครื่องหมาย) เงื่อนไขการกระโดด แฟล็กทดสอบ JG (JNLE) Greater OF = SF , ZF = 0 JL (JNGE) Less OF ≠ SF , ZF = 0 JGE (JNL) Greater or Equal Zero OF = SF , ZF = 1 JLE (JNG) Less or Equal Zero OF ≠ SF , ZF = 1

คำสั่งกระโดด (ตามแฟล็กซ์และรีจิสเตอร์) การกระโดด ความหมาย แฟล็กทดสอบ JNC No Carry CF = 0 JO Overflow OF =1 JNO Not Overflow OF =0 JS Sign SF = 1 JNS No Sign SF = 0 JPO (JNP) Parity odd PF = 0 JPE (JP) Parity Even PF = 1 JCXZ CX = 0 none

ตัวอย่างการใช้คำสั่งกระโดด cmp ah,10 jz lab1 mov bx,2 lab1: add cx,10 ;เปรียบเทียบ ah กับ 10 ;ถ้าเท่ากันให้กระโดดไปที่ lab1 Ex#1 EX#2 cmp ah,10 jge tenup add dl,’0’ jmp endif tenup: add dl,’A’ endif: ;เปรียบเทียบ ah กับ 10 ถ้ามากกว่า ;หรือเท่ากับให้กระโดดไปที่ lab1 ;ปรับค่า dl ;กระโดดไปที่ endif

การประยุกต์คำสั่งกระโดด Repeat Statement; Until condition ; While condition do statement ; condition False True Statement condition False True Statement

การประยุกต์คำสั่งกระโดด (repeat) Pascal Language Assembly Language ax := 10; repeat ax := ax-1; bx := bx+1; cx := ax-bx; until ax = 0 ; dx := dx + 10; mov ax,10 repeat: dec ax inc bx sub ax,bx mov cx,ax cmp ax,0 jnz repeat

การประยุกต์คำสั่งกระโดด (while) Pascal Language Assembly Language while: cmp ax,128h jge endwhile add ax,bx inc bx jmp while endwhile: dec cx while ax < 28h do begin ax := ax+bx ; bx := bx+1 ; end; cx := cx-1 ;

คำสั่งวนรอบ LOOP label คำสั่งวนรอบเป็นคำสั่งที่ใช้ในการกระทำซ้ำ โดยใช้รีจิสเตอร์ CX (Counter Register) ในการนับจำนวนครั้งของการกระทำซ้ำ รูปแบบ LOOP label คำสั่งในกลุ่มนี้คือ LOOP : คำสั่งที่พิจารณาค่าของ CX อย่างเดียว LOOPZ , LOOPNZ : พิจารณาแฟล็กร่วมด้วย

คำสั่งวนรอบ LOOP การทำงานของคำสั่ง LOOP ลดค่าของ CX ลงหนึ่ง โดยไม่กระทบแฟล็ก ถ้า CX ยังมีค่ามากกว่าศูนย์ กระโดดไปทำงานที่เลเบลที่ระบุ คำสั่ง LOOP มีการทำงานเทียบเท่ากับ DEC CX JNZ label แต่ไม่มีการกระทบแฟล็ก

ตัวอย่างการใช้คำสั่งวนรอบ EX mov cx,50h mov bl,1 mov dx,0 addnumber: add dl,bl adc dh,0 inc bl loop addnumber ; ทำซ้ำ 50 ครั้ง ; เริ่มที่ 1 ; ค่าเริ่มต้น = 0 ; บวก 8 บิตล่าง ; บวกตัวทด ; ทำซ้ำ

คำสั่ง LOOPZ และ LOOPNZ คำสั่ง LOOPZ และ LOOPNZ มีการทำงานเหมือนกับคำสั่ง LOOP แต่จะนำค่าของแฟล็กศูนย์มาใช้ในการพิจารณาด้วย LOOPZ จะกระโดดกลับไปทำงานถ้าค่าของ CX ที่ลดแล้วมีค่าไม่เท่ากับศูนย์ และค่าของแฟล็กศูนย์มีค่าเป็นหนึ่ง (Zero) (CX ≠ 0) and (Z = 1) LOOPNZ จะกระโดดกลับไปทำงานถ้าค่าของ CX ที่ลดแล้วมีค่าไม่เท่ากับศูนย์ และค่าของแฟล็กศูนย์มีค่าเป็นศูนย์ (Not Zero) (CX ≠ 0) and (Z = 0)

ข้อพึงระวังของการใช้คำสั่งวนรอบ กรณีที่รีจิสเตอร์ CX มีค่าเท่ากับศูนย์ก่อนการทำงานของคำสั่ง LOOP ค่าของ CX จะถูกปรับค่าเป็น 0FFFFh และการทำงานจะผิดพลาด แก้โดยใช้คำสั่ง JCXZ ในการป้องกันความผิดพลาด action_0 CXZ ENDLOOP LABEL1: action_1 action_2 action_3 LOOP LABEL1 ENDLOOP:

การประกาศข้อมูลหรือตัวแปร ข้อมูลที่โปรแกรมใช้และตัวแปรต่างๆ ที่อยู่ในหน่วยความจำ เป็นสิ่งเดียวกัน การประกาศข้อมูล คือ การระบุให้ assembler จองเนื้อที่ในหน่วยความจำไว้ใช้สำหรับการเก็บข้อมูล และตั้งชื่อให้กับหน่วยความจำตำแหน่งนั้น (สร้างเลเบล)

ตัวอย่างแนวคิดการจองพื้นที่ ตัวอย่างการประกาศตัวแปร เลขจำนวนเต็ม 16 บิต 2 ตัว (i, j) อักขระ 1 ไบต์ (ch) i : j : ch : จะเป็นการจองเนื้อที่ในหน่วยความจำขนาด 5 ไบต์ โดยจะมีเลเบล i j และ ch ชี้ตำแหน่งดังรูป

คำสั่งเทียมสำหรับการจองเนื้อที่ในหน่วยความจำ เราใช้คำสั่งเทียม 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

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

การระบุค่าของหน่วยความจำที่มีการซ้ำ เราใช้คำสั่งเทียม 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 (?)

การอ้างใช้ข้อมูลในหน่วยความจำ 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

การอ้างใช้ข้อมูลในหน่วยความจำ เราสามารถใช้เลเบลที่ประกาศแทนตำแหน่งของมูลในหน่วยความจำได้โดยตรง เราสามารถอ้างหน่วยความจำโดยคิดระยะสัมพัทธ์กับตำแหน่งของเลเบลได้ โดยใช้รีจิสเตอร์ 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 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 3 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

การใช้บริการหมายเลข 09h ของ DOS รับข้อมูลผ่านรีจิสเตอร์ดังนี้ DS : DX = ตำแหน่งของข้อความที่จะแสดง โดยข้อความนี้ต้องจบด้วยเครื่องหมาย ‘$’ AH = 09h dseg segment msg db ’hello’,10,13,’$’ dseg ends mov ah,9 mov dx,offset msg int 21h

การใช้บริการหมายเลข 0Ah ของ DOS รับข้อมูลผ่านรีจิสเตอร์ดังนี้ 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