คำสั่งพื้นฐานของภาษาแอสแซมบลี

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

กำหนด                 ตัวย่อ            ความหมาย        จำนวนไบต์           หน่วย
Define byte            DB               กำหนดไบต์             1                     ไบต์
Define word           DW             กำหนดเวิร์ด            2                     เวิร์ด
Definedubbleword DD              กำหนดดับเบิลเวิร์ด  3                     ดับเบิบเวิร์ด

และยังมีชนิดของข้อมูลอีกหลายตัวที่ไม่ได้กล่าวมาการกำหนดไบต์
ไดเร็กทีฟ DB จะกำหนดที่เก็บข้อมูลขนาด 8 บิต

รูปแบบการใช้งาน
ชื่อ DB ข้อมูลตัวที่ 1,ข้อมูลตัวที่ 2…….
ข้อมูลจะมีค่าเป็นเลขหรือค่าตัวอักษรหรือนิพจน์หรือเครื่องหมาย ? ในกรณีที่ไม่เจาะจงค่า กรณีเป็นตัวเลข ถ้าเป็นตัวเลขแบบคิดเครื่องหมายจะมีค่าอยู่ระหว่าง -128 ถึง 127 หรือถ้าเป็นตัวเลขแบบไม่คิดเครื่องหมายจะมีค่าอยู่ระหว่าง 0 ถึง 255
ตัวอย่าง การกำหนดข้อมูลแบบกำหนดไบต์
char db 'A' ; กำหนดแบบตัวอักษร
char db 41h ; กำหนดเป็นเลขฐานสิบหก
char db 01000001b ; กำหนดเป็นเลขฐานสิบสอง
char db 101q ; กำหนดเป็นเลขฐานแปด
signed1 db -128 ; ค่าต่ำสุดของตัวเลขคิดเครื่องหมาย
signed2 db 127 ; ค่าสูงสุดของตัวเลขไม่คิดเครื่องหมาย
unsigned db 0 ; ค่าต่ำสุดของตัวเลขไม่คิดเครื่องหมาย
unsigned db 255 ; ค่าสูงสุดของตัวเลขไม่คิดเครื่องหมาย
list db 10,20,30,40 ; กำหนดข้อมูลหลายๆข้อมูล
ในการกำหนดข้อมูลสามารถที่จะกำหนดข้อมูลเป็นหลายแบบได้ เช่น ตัวเลข สามารถที่จะเก็บในลาเบลเดียวกันได้เป็นเลขฐานหลายๆฐานได้ เช่น ฐานสิบ ฐานสิบหก ฐานสอง เป็นต้น

ตัวอย่าง list1 และ list2 มีข้อมูลเหมือนกันแต่กำหนดคนละรูปแบบ
list1 db 10,32,41h,00100010db
list2 db 0Ah,20h,'A',22h
ค่าของตัวแปรอาจจะไม่กำหนดได้โดยใช้เครื่องหมาย ? แทน หรือสามารถที่จะเป็นนิพจน์ได้
ตัวอย่างเช่น
count db ?
ages db ?,?,?,?,?
rowsize db 10*20
สำหรับสตริงอาจจะใช้เป็นตัวแปรได้ในกรณีนี้อักขระตัวแรกจะเเก็บในแอดเดรสแรกของตัวแปร
ตัวอย่างเช่น
c_string db "Good morning",0
pascal_string db 12,"Good morning"
ไดเรกทีฟ DB สามารถที่จะใช้กำหนดข้อความที่เป็นอักขระได้หลายบรรทัด ซึ่งตัวแปรหนึ่งตัวจะสามารถเก็บข้อความได้หลายบรรทัดได้ ตัวอย่างสตริง จะสิ้นสุดการกำหนด้วยการแสดงการจบบรรทัดและตามด้วยตัวเลข 0 ไบต์
a_long_string db "This is a long string, that"
db "clearly is going to take"
db "severral line to store an"
db "assembly language program."0Dh,0Ah,0
ตัวแปรภาษาสามารถที่จะคำนวณความยาวของสตริงได้อัตโนมัติ โดยใช้เครื่องหมาย '$' ซึ่งจะเก็บค่าตำแหน่งปัจจุบันสามารถที่จะนับค่าได้ว่ามีกี่ตัว
ตัวอย่าง
กำหนดให้สตริง มีความยาว 16 ตัวอักษร เราสามารถกำหนดตัวแปร เพื่อที่เก็บค่าความยาวของสตริงได้
string db "This is a string"
string_len db $-string

กำหนดเวิร์ด
ไดเรกทีฟ DW จะสร้างพื้นที่เก็บขนาด 16 บิต
รูปแบบ
ชื่อ DW ข้อมูลตัวที่ 1, ข้อมูลตัวที่ 2,…..
ข้อมูลอาจจะเก็บค่าตัวเลขแบบไม่คิดเครื่องหมายขนาด 16 บิต โดยเริ่มจากค่า 0(0h) ถึง 65,535(FFFFFh) สำหรับตัวเลขที่คิดเครื่องหมายจะสามารถเก็บค่าได้อยู่ระหว่าง -32768(8000) ถึง +32767(7FFFFh) หรือ เป็นสตริง ข้อมูลที่เป็นสตริงถ้าเป็นสตริงอักขระเดียวจะเก็บในไบต์ล่างของเวิร์ดก่อน พื้นที่ขนาด 1 เวิร์ด จะสามารถเก็บค่าสตริงได้ 2 อักขระ เช่น 'AB' สำหรับข้อมูลที่ไม่รู้ค่าก็จะใช้เครื่องหมาย ? แทนลักษณะการเก็บในเวิร์ด จะเก็บแบบกลับลำดับเมื่อเก็บในหน่วยความจำ

ตัวอย่าง
การกำหนดข้อมูลโดยใช้ DW ไดเรกทีฟ
value dw 1,2,3 ; กำหนด 3 เวิร์ด
unsinged dw 0,65535 ; ค่าของตัวเลขไม่คิดเครื่องหมาย
signed dw -32768,+32767 ; ค่าของตัวเลขคิดเครื่องหมาย
expression dw 256*2 ; นิพจน์
hexa dw 4000h ; กำหนดเป็นฐานสิบหก
binary dw 1111000011110000b ; กำหนดเป็นฐานสอง
mixed dw 1000h,4096,'AB',0 ; กำหนดหลายแบบ
unknow dw ? ; กำหนดแบบไม่รู้ข้อมูล
คิดว่าน่าจะมีประโยชน์เลยเอามาฝากจากเวบเพื่อนบ้านงะด้วยความอยากแคร็กวินซิบให้ได้ตอนนี้ก็ยังไม่ได้อิอิ
เลยต้องมาหาข้อมูลเพิ่มเติมอิอิ

  เลเบลฟิลด์แรกในคำสั่งภาษาแอสแซมบลี เป็นการให้ชื่อกับตำแหน่งที่อยู่ของคำสั่ง ภาษาแอสแซมบลีคำสั่งนั้น ซึ่งทำให้คำสั่งอื่น ๆ ในโปรแกรมสามารถอ้างถึงคำสั่งที่มีเลเบลนั้น โดยใช้ชื่อของเลเบลได้แทนที่จะใช้ตำแหน่งที่อยู่ของคำสั่ง ทุกคำสั่งในภาษาแอสแซมบลีสามารถ ใช้เลเบลได้ นิยมใช้กันเลเบลจะเป็น Target ของคำสั่ง jump หรือ Procedure call เลเบลหนึ่งประกอบด้วยตัวอักษรได้ถึง 31 ตัวอักษร ซึ่งอาจเป็น ตัวอักษร A ถึง Z ตัวเลข 0 ถึง 9 สัญลักษณ์พิเศษ ?@._$ ตัวแรกในเลเบลจะต้องไม่ใช่ตัวเลข อีกทั้งต้องไม่มีช่องว่างในเลเบล ถ้าต้องการทำให้ดูเหมือน มีช่องว่างให้ใช้เครื่องหมายขีดเส้นใต้ (_) แทนนอกจากนั้น อักษรต่อไปนี้คือ AH,AL,AX,BH, BX,CH.CL,DH,DL,DI,DS,ES,SI, และ SP เป็นอักษรแทนรีจิสเตอร์ จะนำไปใช้เป็นเลเบลไม่ได้ คำสั่งที่เป็น Mnemonic ก็จะนำไปใช้เป็นเลเบลไม่ได้
GET_COUNT : MOV CX,DI ;initialize code JMP GET_COUNT

                  ตัวอย่างข้างต้นนี้ คำสั่ง JMP ทำให้การประมวลผลข้อมูลแบบเรียงลำดับคำสั่งเปลี่ยนไป เพราะเป็นคำสั่งควบคุมที่ทำให้คอมพิวเตอร์ไปทำงานที่คำสั่งที่มีเลเบล GET_COUNT ไมโครโปรเซสเซอร์ 8088 ทำให้เกิดการย้ายการทำงาน ได้ใน 2 วิธีคือ ถ้าคำสั่งที่มีเลเบลอยู่ใน Code segment เดียวกันกับคำสั่งควบคุมให้ย้ายที่การทำงาน 8088 จะโหลดออฟเซตของเลเบลใส่ลงใน Instruction pointer (IP) โดยที่ ค่าของ Code segment (CS) รีจิสเตอร์ไม่เปลี่ยนแปลงถ้าคำสั่งที่มีเลเบลอยู่ต่าง Code segment กับคำสั่งควบคุม 8088 จะโหลดออฟเซตของเลเบลใส่ใน IP และค่าของเซกเมนต์ใน CS ถ้าเป็นการใช้วิธีที่ 1 เลเบลจะต้องตามด้วยโคลอน (: ) แต่ถ้าเป็นการใช้วิธีที่ 2 ก็ไม่ต้องมีเครื่องหมายโคลอน

                 คำสั่งการทำงาน (Mnemonic Field) หน้าที่หลักของแอสแซมเบลอร์คือการแปลคำสั่งการทำงาน ให้เป็นคำสั่งที่เครื่อง คอมพิวเตอร์เข้าใจได้ แอสแซมเบลอร์ทำการแปลโดยใช้ตารางซึ่งจะแปลคำสั่งที่เป็น Mnemonic ให้เป็นชุดของเลขฐานสองซึ่ง เครื่องคอมพิวเตอร์สามารถทำงานได้ แอสแซมเบลอร์ทำงานมากกว่า การแปลคำสั่งของรหัสปฏิบัติการ มันต้องพิจารณาได้ด้วยว่าคำสั่งปฏิบัติการนั้นต้องการ ออปเปอเรนต์กี่ตัว และชนิดของออปเปอเรนต์ คำสั่งบางคำสั่งไม่ต้องการออกเปอเรนต์ บางคำสั่งก็ต้องการออปเปอเรนด์เพียงตัวเดียว และบางครั้งก็ต้องการ ออปเปอเรนต์ ถึงสองตัว ออปเปอแรนด์ฟิลด์ (Operand field) ออปเปอแรนด์ฟิลด์ บอกไมโครโปรเซสเซอร์ 8088 ว่าสามารถจะไปนำข้อมูลที่จะมา ปฏิบัติการได้จากไหน ตัวอย่งเช่น MOV CX,DX ออปเปอแรนด์ฟิลด์ CX,DX บอกไมโครโปรเซสเซอร์ว่า ให้ลอกข้อความที่อยู่ในรีจิสเตอร์ DX มาไว้ในรีจิสเตอร์ CX คำสั่งต้องการออปเปอแรนด์ 2 ตัวต้องใช้เครื่องหมาย , คั่นระหว่างออปเปอแรนด์ทั้งสองนั้น ออปเปอแรนด์ตัวแรกเป็น Destination operand และออปเปอแรนด์ตัวที่สองเป็น Source operand Source operand อ้างถึงค่าที่จะบวก ลบ เปรียบเทียบผลลัพธ์เก็บใน Destination operand
ตัวชี้ ( pointer )

ตัวชี้ ( pointer )
ค่าออฟเซตในตัวแปรหรือโปรแกรมย่อย สามารถที่จะเก็บตัวแปรอื่นได้ เรียกตัวแปรนี้ว่า ตัวชี้
ดังตัวอย่าง
list dw 256,257,285,259 ; กำหนด 4 เวิร์ด
p dw list ; p ชี้ไปที่ list
P1 dw P ; ตัวชี้ชี้ตัวชี้
aProc dw clear_screen ; ชี้ไปที่ clear_screen
ตัวแปลภาษาแอสเซมบลี้จะนำค่าออฟเซตของ list ไปเก็บไว้ที่ P แล้ว P1 จะเก็บค่าแอดเดรส-ของ P aProc จะเก็บค่าของออฟเซตของโปรแกรมย่อย clear_screen กำหนดดับเบิลเวิร์ด
ไดเรกทีฟ DD จะสร้างที่เก็บขนาด 32 บิต
รูปแบบ
ชื่อ DD ข้อมูลตัวที่ 1,ข้อมูลตัวที่ 2,………
ข้อมูลที่สามารถจะเก็บในรูปแบบ DD ได้แก่ ข้อมูลที่เป็นไบนารี่มีค่าตั้งแต่ 0h จนถึง 0FFFFFFFFh , ค่าเซกเมนต์ออฟเซต , เลขจำนวนจริง หรือเลขฐานสิบ การเก็บข้อมูลในหน่วยความจำแบบดับเบิลเวิร์ดจะเก็บแบบกลับลำดับ ดั้งนั้นบิตสูงสุดของข้อมูลจะเก็บในแอดเดรสต่ำสุด ตัวอย่างเช่น 12345678h เก็บในหน่วยความจำดังนี้
ออฟเซต : 00 01 02 03

ที่มา: www.thaishadow.com

1 ความคิดเห็น:

ไม่ระบุชื่อ กล่าวว่า...

คำสั่งพื้นฐานของภาษาแอสแซมบลี >>>>> Download Now

>>>>> Download Full

คำสั่งพื้นฐานของภาษาแอสแซมบลี >>>>> Download LINK

>>>>> Download Now

คำสั่งพื้นฐานของภาษาแอสแซมบลี >>>>> Download Full

>>>>> Download LINK

แสดงความคิดเห็น