ธนาวินท์ รักธรรมานนท์

Slides:



Advertisements
งานนำเสนอที่คล้ายกัน
คณิตคิดเร็วโดยใช้นิ้วมือ
Advertisements

ชนิดของข้อมูลในโปรแกรม Interactive C
ครั้งที่ 9 Function(ต่อ).
บทที่ 2 รหัสควบคุมและการคำนวณ
บทที่ 11 โปรแกรมย่อยขั้นต้น
การเสนอโครงการวิทยานิพนธ์
ตัวแปรชุด การเขียนโปรแกรมภาษาคอมพิวเตอร์ 1
2.2.3 การแก้ไขแอดเดรส โดยการใช้อินเด็กรีจิสเตอร์
สถาปัตยกรรมแบบ stack และ การผลิตโค๊ด
CS Assembly Language Programming
CS Assembly Language Programming
CS Assembly Language Programming
CS Assembly Language Programming
CS Assembly Language Programming Period 16.
จำนวนเต็ม จำนวนเต็ม  ประกอบด้วย                   1. จำนวนเต็มบวก    ได้แก่  1 , 2 , 3 , 4, 5 , ....                   2.  จำนวนเต็มลบ      ได้แก่  -1.
หลักการออกแบบเว็บ กำหนดกลุ่มเป้าหมาย จำแนกกลุ่มเนื้อหา
Week 6 ประกาศค่าตัวแปร.
บทที่ 1 อัตราส่วน.
NUMBER SYSTEM เลขฐานสิบ (Decimal Number) เลขฐานสอง (Binary Number)
จำนวนนับใดๆ ที่หารจำนวนนับที่กำหนดให้ได้ลงตัว เรียกว่า ตัวประกอบของจำนวนนับ จำนวนนับ สามารถเรียกอีกอย่างว่า จำนวนเต็มบวก หรือจำนวนธรรมชาติ ซึ่งเราสามารถนำจำนวนนับเหล่านี้มา.
การประกาศตัวแปร “ตัวแปร” คือสิ่งที่เราสร้างขึ้นมาเพื่อใช้เก็บค่าต่างๆและอ้างอิงใช้งานภายในโปรแกรม ตามที่เรากำหนดขึ้น การสร้างตัวแปรขึ้นมาเราเรียกว่า.
ขั้นตอนการแปลงไฟล์.
C Programming Lecture no. 6: Function.
SCC : Suthida Chaichomchuen
การออกแบบโปรแกรมอย่างมีโครงสร้าง Structured Design
การจัดการข้อมูลด้วยคอมพิวเตอร์
Control Transfer Instructions
Addressing Modes Assembly Programming.
การเขียนโปรแกรมเชิงวัตถุ ด้วยภาษาจาวา
บทที่ 3 ตัวดำเนินการ และ นิพจน์
คณิตศาสตร์ แสนสนุก.
CS Assembly Language Programming
CS Assembly Language Programming
CS Assembly Language Programming Period 30.
ดีบักเป็นเครื่องมืออันหนึ่งที่ให้ผู้ใช้ ตรวจสอบ และแก้ไขค่าใน หน่วยความจำ โหลด เก็บ ตรวจสอบค่าในเรจิสเตอร์ และสามารถ เขียนโปรแกรมแอสเซมบลีได้อย่าง สะดวก.
ASSIGN3-4. InstructionResult Z-FlagC-FlagP-FlagS-FlagO-Flag MOV AL,9Eh 9Eh H ????? ADDAL,9Eh 3C ADD AL,1Eh 5A
แบบฝึกหัด 24/12/09. เมื่อคอมพ์ทำคำสั่งต่อไปนี้ จงแสดง ผลลัพธ์และ ค่าแฟลกต่างๆ InstructionResult Z-FlagC-FlagP- Flag S- Flag O- Flag MOV AL,3h Inc AL Mov.
อาร์เรย์และข้อความสตริง
บทที่ 15 โปรแกรมย่อยและแสต็ก
บทที่ 17 คำสั่งตารางและการสร้างแมคโคร
บทที่ 10 โครงสร้างควบคุม
ธนาวินท์ รักธรรมานนท์
ธนาวินท์ รักธรรมานนท์
ธนาวินท์ รักธรรมานนท์
โปรแกรมภาษาแอสเซมบลี้ (2)
ภาควิชาวิทยาศาสตร์ประยุกต์ คณะวิทยาศาสตร์เทคโนโลยีและการเกษตร
Debug #2 โครงสร้างคอมพิวเตอร์ และภาษาแอสเซมบลี้
เซกเมนต์ (Segment) โครงสร้างคอมพิวเตอร์ และภาษาแอสเซมบลี้
อินเทอร์รัพท์ (Interrupt)
ตัวแปรกับชนิดของข้อมูล
ค31211 คณิตศาสตร์สำหรับ คอมพิวเตอร์ 1
ปฏิบัติการครั้งที่ 10 pointer. หน่วยความจำ หน่วยความจำนั้นเสมือนเป็นช่องว่างไว้เก็บ ของที่มีหมายเลขประจำติดไว้ที่แต่ละช่อง เพื่อใช้ในการระบุตำแหน่งของช่องได้
การรับและพิมพ์ข้อมูลเบื้องต้น
สถาปัตยกรรมคอมพิวเตอร์ (Computer Architecture)
Week 2 Variables.
CS Assembly Language Programming
Computer Programming for Engineers
ความหมาย การประกาศ และการใช้
วิทยา กรระสี (วท.บ. วิทยาการคอมพิวเตอร์)
การกระโดดและการวนรอบ
ค21201 คณิตศาสตร์เพิ่มเติม 1
F M B N สมบัติของจำนวนนับ ตัวคูณร่วมน้อย (ค.ร.น.).
เรื่องการประยุกต์ของสมการเชิงเส้นตัวแปรเดียว
หลักการเขียนโปรแกรม ( )
Chapter 11 Instruction Sets: Addressing Modes
ตัวแปร และชนิดข้อมูล.
เรื่อง ทักษะกระบวนการทางคณิตศาสตร์
โครงสร้างข้อมูลแบบ สแตก (stack)
Microcomputer and Assembly Language
โปรแกรมภาษาแอสเซมบลี้เบื้องต้น
ใบสำเนางานนำเสนอ:

ธนาวินท์ รักธรรมานนท์ fengtwr@ku.ac.th การอ้างแอดเดรส ธนาวินท์ รักธรรมานนท์ fengtwr@ku.ac.th

หัวข้อในวันนี้ ทบทวนโปรแกรมย่อย รูปแบบการอ้างแอดเดรส การทำงานของแสต็กซ์ขณะเรียกใช้งานโปรแกรมย่อย รูปแบบการอ้างแอดเดรส ตัวอย่างการแสดงแสดงอักษรบนหน้าจอ

โปรแกรมย่อยขั้นต้น การเรียกใช้ การประกาศ procname PROC NEAR … ;program RET procname ENDP การเรียกใช้ CALL procname

ตัวอย่างโปรแกรมย่อย - การประกาศ printhexdigit proc near mov dl , al cmp al , 10 jae AtoF add dl , ‘0’ jmp Printit AtoF: add dl , ’A’-10 Printit: mov ah , 02h int 21h ret printhexdigit endp

ตัวอย่างโปรแกรมย่อย - การเรียกใช้ ; print a 2-digit hex number ; the digits is stored in bh,bl ... mov al,bh call printhexdigit mov al,bl ข้อเสียหลักคือรีจิสเตอร์ที่ถูกใช้งานในโปรแกรมย่อยทั้งหมดจะถูกเปลี่ยนค่าไปด้วย แก้โดยใช้แสต็กซ์มาเก็บค่าของรีจิสเตอร์แต่ละตัวไว้ก่อนการทำงาน

การอ้างแอดเดรส การอ้างแอดเดรสใน 8086 นั้นจะระบุตำแหน่งโดยใช้ตัวเลข 16 บิตสองตัว : เซกเมนต์ และ ออฟเซ็ต ในการอ้างข้อมูลทั่วไป ออฟเซ็ตที่เราระบุจะคิดเทียบกับ DS mov ax,[100h] mov bl,[bx] mov bx+10],cx mov ax,[es:100h] mov bl,es:[bx] mov ss:[bx+10],cx

รูปแบบการอ้างแอดเดรส อ้างแบบรีจิสเตอร์ (Register addressing) mov ax, bx อ้างแบบค่าคงที่ (Immediate addressing) mov ax, 10 อ้างโดยตรง (Direct addressing) โดยระบุตำแหน่งของ offset ลงไปโดยตรง mov ax , [100h] mov [200h], cl mov dx , [300h]

รูปแบบการอ้างแอดเดรส อ้างทางอ้อมโดยใช้รีจิสเตอร์ (Register indirect addressing) รีจิสเตอร์ BX, SI, และ DI ใช้คู่กับเซกเมนต์ DS รีจิสเตอร์ BP จะใช้คู่กับเซกเมนต์ SS สามารถกำหนดเองทั้งสองรีจิสเตอร์ mov ax , [bx] mov cx , [si] mov dl , [bp] mov di , es:[bx] mov ax , [cs:bx]

รูปแบบการอ้างแอดเดรส อ้างแบบสัมพัทธ์กับฐาน (Base relative addressing) ตำแหน่งของข้อมูลจะได้จากการนำค่าคงที่ไปบวกกับค่าในรีจิสเตอร์ BX (เทียบกับ DS) หรือ BP (เทียบกับ SS) mov ax,[bx] ;x add ax,[bx+2] ;+y add ax,[bx+4] ;+z mov [bx+6],ax ;c=x+y+z add bx,8 loop updateloop

รูปแบบการอ้างแอดเดรส อ้างแบบดัชนีโดยตรง (Direct indexed addressing) แอดเดรสของข้อมูลจะได้จากการนำค่าของรีจิสเตอร์ดัชนี SI หรือ DIมาบวกกับเลขคิดเครื่องหมายขนาดแปดบิต (หรือเลขไม่คิดเครื่องหมายขนาดสิบหกบิต) mov ax , balance[si] sub ax , credit[si] add ax , debit[si] mov balance[si] , ax

การอ้างแบบดัชนีโดยตรง VS การอ้างแบบสัมพัทธ์กับฐาน การอ้างแอดเดรสทั้งสองแบบมีความคล้ายคลึงกันมาก จนสามารถใช้แทนกันได้ TABLE[SI] [BX+10] ฐาน การอ้างแบบดัชนี TABLE SI การอ้างแบบสัมพัทธ์ กับฐาน BX 10 ดัชนี

รูปแบบการอ้างแอดเดรส อ้างแบบดัชนีกับฐาน (Base indexed addressing) ตำแหน่งของข้อมูลจะคิดเทียบกับค่าของรีจิสเตอร์ฐาน (BX หรือ BP) รวมกับค่าของรีจิสเตอร์ดัชนี (SI หรือ DI) ถ้าคิดสัมพัทธ์กับ BP ออฟเซ็ตที่ได้จะคิดเทียบกับรีจิสเตอร์ SS (Stack Segment) เสมอ BX SI mov ax,[bx+si+2] mov [bx+di],al inc byte ptr [bx+si] mov dx,[bp+si+2] mov [bp+di+2],dx

โปรแกรมแสดงตัวอักษรแบบใหญ่ # ###### ##### # # # # # # # # # # # # # ###### # ####### # # # # # # # # # # # ###### ##### เขียนโปรแกรมย่อยที่แสดงตัวอักษร A ถึง Z แบบใหญ่ ต้องมีการเก็บรูปแบบตัวอักษร (font) ที่จะพิมพ์ไว้ในหน่วยความจำ ประกาศ font โดยใช้แค่ 8x8 ไบต์ จะเก็บ font เป็นอย่างไร

“เก็บเป็นตาราง 8x8 ช่องละไบต์ถ้าพิมพ์ให้เก็บค่า 1 ถ้าว่างก็เก็บเป็น 0 แล้วกัน” .data fontbuf db 0,0,0,1,0,0,0,0 ;A db 0,0,1,0,1,0,0,0 db 0,1,0,0,0,1,0,0 db 1,0,0,0,0,0,1,0 db 1,1,1,1,1,1,1,0 db 0,0,0,0,0,0,0,0 db 1,1,1,1,1,1,0,0 ;B db 1,1,1,1,1,1,0,0 db … (อีกยาวเลย) ตารางคงประมาณนี้ !!!

“ เก็บเป็นตาราง 8x8 ช่องละไบต์เก็บเป็นตัวอักษรที่จะพิมพ์เลย ‘#’ กับ ‘ ‘ ดีกว่า ” .data fontbuf db ’ # ’ ;A db ’ # # ’ db ’ # # ’ db ’####### ’ db ’# # ’ db ’ ’ db ’###### ’ ;B db ’###### ’ db ... (ค่อยดูดีหน่อย :)

โปรแกรมแสดงตัวอักษรแบบใหญ่-แนวคิด จะพิมพ์ยังไงดี ?? เขียนโปรแกรมย่อยแสดงตัวอักษรครั้งละอักษร ใส่รหัส ASCII ของตัวอักษรทางรีจิสเตอร์ DL แบ่งเป็นโปรแกรมย่อย ส่วนหาตำแหน่งเริ่มต้นของรูปแบบของตัวอักษรที่ต้องการ ตัวอักษรตัวแรกเริ่มที่ตัว ‘A’ เริ่มที่ offset fontbuf แต่ละตัวตำแหน่งเพิ่มขึ้น 64 ไบต์ ส่วนพิมพ์ตัวอักษรตัวใหญ่ตามข้อมูลที่เก็บ (8x8 ไบต์)

โปรแกรมแสดงตัวอักษรแบบใหญ่-ส่วนที่ 1 ส่วนหาตำแหน่งเริ่มต้นของรูปแบบของตัวอักษรที่ต้องการ ตัวอักษรตัวแรกเริ่มที่ตัว ‘A’ เริ่มที่ offset fontbuf แต่ละตัวตำแหน่งเพิ่มขึ้น 64 ไบต์ mov bx,offset fontbuf mov dh,0 sub dx,’A’ mov cl,6 shl dx,cl ;dx*=64 add bx,dx ;bx=buf addr

โปรแกรมแสดงตัวอักษรแบบใหญ่-ส่วนที่ 2 ส่วนพิมพ์ตัวอักษรตัวใหญ่ตามข้อมูลที่เก็บ (8x8 ไบต์) mov si,0 mov dh,0 printline: mov cx,8 printonechar: mov dl,[bx+si] call printchar inc si loop printonechar call printnewline inc dh cmp dh,8 jnz printline

โปรแกรมแสดงตัวอักษรแบบใหญ่ - แบบบิต สังเกตว่าข้อมูล font ของเราสามารถเก็บในรูปแบบอื่นเพื่อให้มีขนาดเล็กลงได้ เช่น เก็บเป็นบิต หนึ่งบรรทัดมี 8 ตัวอักษร -> 1 ไบต์ ข้อมูลที่ได้จะมีขนาดเล็กลงมาก 10h 28h 44h FEh 82h 00h .data fontbuf db 10h,28h,44h,0FEh ;A db 82h,82h,82h,00h db 0FCh,82h,82h,0FCh ;B db 82h,82h,0FCh,00h db ... (แต่อย่างนี้เขียนเองไม่ไหว)

สิ่งที่ต้องแก้ไข หาตำแหน่งเริ่มต้นใหม่ : ตัวอักษรตัวหนึ่งใช้แค่ 8 ไบต์ (คูณแค่ 8) แสดงผลแบบใหม่ โดยต้องใช้การทดสอบระดับบิตเข้ามาช่วย mov si,0 mov di,0 printline: mov dh,[bx+si] mov cx,8 printonechar: mov ah,dh and ah,80h jz printzero mov dl,’#’ jmp printit printzero: mov dl,’ ’ printit: call printchar rol dh,1 loop printonechar call printnewline inc si inc di cmp di,8 jnz printline 10h 28h 44h FEh 82h 00h

โปรแกรมแสดงตัวอักษรแบบใหญ่ - ของจริง จริง ๆ แล้วไม่ต้องสร้าง font เอง ในหน่วยความจำตำแหน่งที่ 0FFA6:000Eh จะมีรูปของตัวอักษรต่าง ๆ ตั้งแต่ตัวอักษรที่มีรหัส ASCII=0 ถึงรหัส 127. โดยเก็บในลักษณะเดียวกันกับที่เราใช้ (เก็บเป็นบิต) -d f000:fa6e F000:FA60 00 00 F000:FA70 00 00 00 00 00 00 7E 81-A5 81 BD 99 81 7E 7E FF F000:FA80 DB FF C3 E7 FF 7E 6C FE-FE FE 7C 38 10 00 10 38 F000:FA90 7C FE 7C 38 10 00 38 7C-38 FE FE 7C 38 7C 10 10 F000:FAA0 38 7C FE 7C 38 7C 00 00-18 3C 3C 18 00 00 FF FF F000:FAB0 E7 C3 C3 E7 FF FF 00 3C-66 42 42 66 3C 00 FF C3 F000:FAC0 99 BD BD 99 C3 FF 0F 07-0F 7D CC CC CC 78 3C 66 F000:FAD0 66 66 3C 18 7E 18 3F 33-3F 30 30 70 F0 E0 7F 63 F000:FAE0 7F 63 63 67 E6 C0 99 5A-3C E7 E7 3C 5A 99 -

Question ?