CS Assembly Language Programming

Slides:



Advertisements
งานนำเสนอที่คล้ายกัน
ตารางค่าความจริง คือ อะไร
Advertisements

การประยุกต์ Logic Gates ภาค 2
Appendix A2 จัดทำโดย นางสาว อารยา จำปัน
ระบบเลขฐานสอง โดย นางสาวภาณุมาศ นักษัตรมณฑล รหัสนิสิต
เลขฐานต่าง ๆ อ.มิ่งขวัญ กันจินะ.
การแทนข้อมูลในคอมพิวเตอร์
วงจรดิจิตอล Digital Circuits Wadchara.
การแทนค่าข้อมูล และ Primary Storage (Memory)
CS Assembly Language Programming
CS Assembly Language Programming
CS Assembly Language Programming
CS Assembly Language Programming
CS Assembly Language Programming
CS Assembly Language Programming
CS Assembly Language Programming
CS Assembly Language Programming Period 16.
ชนิดของข้อมูลและตัวดำเนินการ
ทศนิยมและเศษส่วน F M B N โดย นางสาวสุพรรษา ธรรมสโรช.
Number System[1] เลขฐาน & ASCII CODE Number System[1]
NUMBER SYSTEM เลขฐานสิบ (Decimal Number) เลขฐานสอง (Binary Number)
EEE 271 Digital Techniques
Digital Logic and Circuit Design
Number Representations
ระบบเลข และการแทนรหัสข้อมูล
การหาค่ากำลังสองของเลขที่ลงท้ายด้วย 5
การหาค่ากำลังสองของเลขที่ลงท้ายด้วย 5
Addressing Modes Assembly Programming.
Arithmetic Instruction
ดิจิตอล + เลขฐาน บทที่ 2.
Introduction to Digital System
Introduction to Digital System
การเขียนโปรแกรมเชิงวัตถุ ด้วยภาษาจาวา
บทที่ 3 ตัวดำเนินการ และ นิพจน์
จำนวนทั้งหมด ( Whole Numbers )
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.
ความหมายของตัวเลขในหลักต่าง ๆ
ธนาวินท์ รักธรรมานนท์
โปรแกรมภาษาแอสเซมบลี้ (2)
ระบบเลขฐาน (Radix Number)
แผนผังคาร์โนห์ Kanaugh Map
ตอนที่ 4 ความรู้พื้นฐานทางดิจิตอล
การแปลงเลขฐานใดๆเป็นฐานใดๆ
ค33211 คณิตศาสตร์สำหรับ คอมพิวเตอร์ 5
ค21201 คณิตศาสตร์เพิ่มเติม 1
บทเรียนสาระการเรียนรู้คณิตศาสตร์ โดยใช้โปรแกรม Microsoft Multipoint
สถาปัตยกรรมคอมพิวเตอร์ (Computer Architecture)
ปฏิบัติการแบบแยก Branch Operation.
ระบบคอมพิวเตอร์และการประมวลผล
การกระโดดและการวนรอบ
ค21201 คณิตศาสตร์เพิ่มเติม 1
F M B N สมบัติของจำนวนนับ ตัวคูณร่วมน้อย (ค.ร.น.).
ชนิดของข้อมูล 1) ข้อมูลที่เป็นตัวเลข (Numeric Data) หมายถึง ข้อมูลที่ใช้แทนจำนวนที่สามารถนำ ไปคำนวณได้ ข้อมูลแบบนี้เขียนได้หลายรูปแบบ คือ           ก.
ง เทคโนโลยีสารสนเทศและการสื่อสาร ระบบเลขฐาน
ระบบเลขในคอมพิวเตอร์
เรื่องการประยุกต์ของสมการเชิงเส้นตัวแปรเดียว
ระบบเลขฐาน.
รหัสคอมพิวเตอร์.
Introduction to Computer Organization and Architecture Introduction to Computer Organization and Architecture Episode 3 Numbers Representation.
จำนวนจริง จำนวนอตรรกยะ จำนวนตรรกยะ เศษส่วน จำนวนเต็ม จำนวนเต็มบวก
เรื่องการประยุกต์ของสมการเชิงเส้นตัวแปรเดียว
Introduction to Digital System
ระบบเลขจำนวน ( Number System )
การกระทำทางคณิตศาสตร์
ตัวแปร และชนิดข้อมูล.
โครงสร้างข้อมูลแบบ สแตก (stack)
ใบสำเนางานนำเสนอ:

CS344-321 Assembly Language Programming Period 23

Data in Decimal Format Format แทนด้วย Binary-Coded Decimal (BCD) ซึ่งใช้ 4 บิต แทนเลขฐานสิบหนึ่งตัว คือ 0000 แทน 0 , 0001 แทน 1, … , 1000 แทน 8 , และ 1001 แทน 9 ตามลำดับ สำหรับเครื่องหมาย ผู้ใช้ต้องจัดการเอง Format ก. ASCII มีรหัสตาม ASCII code เช่น 31h 35h 32h 37h แทน 1327 เป็นต้น ข. Unpacked BCD สี่บิตบนมีค่า 0 และสี่บิตล่างมีค่า BCD ตามเลขฐานสิบ เช่น 01h 05h 02h 07h แทน 1527 เป็นต้น ค. Packed BCD หนึ่งไบต์แทนตัวเลข BCD สองตัว เช่น 15h 27h แทน 1527 เป็นต้น

จงเขียนเลขฐานสิบ 274 เป็นเลขฐานสิบหกแบบ ก) ASCII 32h 37h 34h ต้องใช้จำนวนไบต์ = 3 ไบต์ ข) Unpacked BCD 02h 07h 04h ต้องใช้จำนวนไบต์ = 3 ไบต์ ค) Packed BCD 0274h ต้องใช้จำนวนไบต์ = 2 ไบต์

หมายเหตุ คำสั่งของ Intel 8086/8088 การบวกลบคูณหารเลขฐานสิบทำได้ทีละ หนึ่งไบต์ และใช้al เป็นหลัก การบวกเลข ASCII และ Unpacked BCD ต้องใช้คำสั่ง add หรือ adc มาก่อน โดยมี al เป็นตัวตั้ง จากนั้นจึงใช้คำสั่ง aaa กรณีที่ต้องการให้ตัวทดเก็บใน ah ให้ใส่ 0 ใน ah ก่อนการบวก ก) ASCII เช่น ต้องการ 38h + 34h mov ax,0038h ; ค่าใน al คือ 38h ค่าใน ah คือ 00h add al,34h ; เป็นการบวกแบบ binary ธรรมดา ค่าใน al คือ 6Ch aaa ; ปรับค่าใน al ให้ถูกต้อง จะได้ 01 02 h เก็บใน ax หมายเหตุ ค่าใน ax ไม่ใช่ ASCII ตามที่ต้องการแต่เป็น Unpacked BCD ถ้าต้องการให้ถูกต้อง ต้องใช้คำสั่ง or ax,3030h อีกคำสั่งหนึ่ง

ข) Unpacked BCD เช่น ต้องการ 09h + 09h mov ax,0009h ; ค่าใน al คือ 09h ค่าใน ah คือ 00h add al,al ; เป็นการบวกแบบ binary ธรรมดา ค่าใน al คือ 12h aaa ; ปรับค่าใน al ให้ถูกต้อง จะได้ 01 08 h เก็บใน ax หมายเหตุ ค่าใน ax เป็น Unpacked BCD ตามที่ต้องการ

ถ้าไม่ต้องการเก็บตัวทดใน ah ก็ไม่จำเป็นต้องกำหนดให้ ah เป็น 0 เช่น ต้องการบวกเลข Unpacked BCD ขนาดไม่เกิน 3 ตัว .data opd1+2 opd1+1 opd1 opd1 db 01h,07h,00h opd2+2 opd2+1 opd2 opd2 db 02h,03h,00h result+2 result+1 result result db 3 dup(?) .code mov ax,@data mov ds,ax 00 07 01 00 03 02

00 07 01 00 03 02 CF mov al,opd1 opd1+2 opd1+1 opd1 add al,opd2 aaa opd2+2 opd2+1 opd2 mov result,al mov al,opd1+1 adc al,opd2+1 result+2 result+1 result aaa mov result+1,al mov al,opd1+2 adc al,opd2+2 mov result+2,al (ดูที่ CF ว่ามีการทดหรือไม่) mov al,opd1 opd1+2 opd1+1 opd1 add al,opd2 aaa opd2+2 opd2+1 opd2 mov result,al mov al,opd1+1 adc al,opd2+1 result+2 result+1 result aaa mov result+1,al mov al,opd1+2 adc al,opd2+2 mov result+2,al (ดูที่ CF ว่ามีการทดหรือไม่) 00 07 01 00 03 02 CF

คำสั่ง AAA ไม่มี operand ใช้เพื่อปรับค่าในเรจิสเตอร์ AX เท่านั้น โดยการพิจารณาค่า 4 บิตล่างของ AL ถ้ามีค่าระหว่าง 0-9 ก็จะทำให้ 4 บิตบนของ AL มีค่าเป็น 0 และกำหนดให้ AF กับ CF มีค่าเป็น 0 ถ้า มีค่ามากกว่า 9 หรือ AF มีค่า 1 จะมีวิธีการปรับค่า ดังนี้ บวก 6 กับเรจิสเตอร์ AL เลข 6 มาจาก 16 (hexadecimal) – 10 (decimal) เพื่อให้ A+6 = 0 ทด 1 , B+6 = 1 ทด 1 , ... บวก 1 (ตัวทด) กับเรจิสเตอร์ AH กำหนดให้ AF = 1 และ CF = 1 (บอกให้รู้ว่ามีการทด) กำหนดให้ 4 บิตบนของเรจิสเตอร์ AL มีค่า 0 หมายเหตุ เนื่องจาก การปรับค่าใน AL จะถูกกำหนดให้เป็น 0 เสมอ ดังนั้น ไม่ว่าจะบวกเลขแบบ ASCII หรือ Unpacked หลังจากคำสั่ง AAA แล้ว จะได้ผลลัพธ์เก็บแบบ Unpacked BCD เสมอ

เช่น ASCII 35 + ASCII 35 AL 0011 0101b หรือ 35h 0011 0101b หรือ 35h AL = 0110 1010b หรือ 6Ah AF = 0 4 บิตล่างของ AL มีค่ามากกว่า 9 ปรับค่าใน AL โดยการบวกด้วย 6 บวก 1 (ตัวทด) ไปที่ AH กำหนดให้ AF = 1 และ CF = 1 กำหนดให้ 4 บิตบนของ AL = 0 AH AL ? 0111 1010 หรือ 6Ah 0110 หรือ 6 ?+1 0000 0000 หรือ 00h AF = 1 CF = 1

เช่น Unpacked 09 + Unpacked 09 AL 0000 1001b หรือ 09h 0000 1001b หรือ 09h AL = 0001 0010b หรือ 12h AF = 1 ปรับค่าใน AL โดยการบวกด้วย 6 บวก 1 (ตัวทด) ไปที่ AH กำหนดให้ AF = 1 และ CF = 1 กำหนดให้ 4 บิตบนของ AL = 0 AH AL ? 0001 0010 หรือ 12h 0110 หรือ 6 ?+1 0000 1000 หรือ 18h AF = 1 CF = 1

การบวกเลข Packed BCD ต้องใช้คำสั่ง add หรือ adc มาก่อน โดยมี al เป็นตัวตั้ง จากนั้นจึงใช้คำสั่ง daa DAA ใช้สำหรับปรับค่าของการบวก packed BCD วิธีการปรับค่าของคำสั่ง DAA ทำดังนี้ ถ้า 4 บิตล่างของเรจิสเตอร์ AL มีค่ามากกว่า 9 หรือ AF = 1 จะบวกค่า 6 กับ เรจิสเตอร์ AL และกำหนดให้ AF = 1 ถ้า 4 บิตบนของเรจิสเตอร์ AL มีค่ามากกว่า 9 หรือ CF = 1 จะบวกค่า 60h กับเรจิสเตอร์ AL และกำหนดให้ CF = 1 หมายเหตุ จะไม่มีการบวกตัวทด คือ 1 ไปที่ AH ผู้ใช้ต้องตรวจสอบเองว่า CF = 1 หรือไม่ ถ้าใช่ แสดงว่ามีตัวทด

เช่น Packed BCD 59h + Packed BCD 35h mov ah,0 ; ไว้เก็บตัวทด mov al,59h ; 0101 1001 add al,35h ; 0011 0101 ; หลังการบวก al = 8Eh 1000 1110 daa ; 4 บิตล่าง > 9 ปรับค่า al +6 AF = 1 0110 ; 4 บิตบน <= 9 และ CF =0 1001 0100 ; ไม่ต้องปรับค่า 4 บิตบน al = 94h adc ah,0 ; บวกตัวทดใน ah โดยไม่ต้องทดสอบ CF ah = 0 al = 94h AF = 0 CF = 0

เช่น Packed BCD 88h + Packed BCD 49h mov ah,0 ; ไว้เก็บตัวทด mov al,88h ; 1000 1000 add al,49h ; 0100 1001 ; หลังการบวก al = 0D1h 1101 0001 daa ; AF = 1 ปรับค่า al +6 0110 ; CF = 0 แต่ 4 บิตบน > 9 1101 0111 ; ปรับค่าด้วย 60h 0110 0000 ; al = 37h CF = 1 (มีการทด) 0011 0111 adc ah,0 ; บวกตัวทดใน ah โดยไม่ต้องทดสอบ CF ah = 1 al = 37h AF = 1 CF = 0 CF = 1

การลบเลข ASCII และ Unpacked BCD ต้องใช้คำสั่ง sub หรือ sbb มาก่อน โดยมี al เป็นตัวตั้ง จากนั้นจึงใช้คำสั่ง aas การปรับค่าทำกลับกับ aaa (ดู sheet) การลบเลข Packed BCD ต้องใช้คำสั่ง sub หรือ sbb มาก่อน โดยมี al เป็นตัวตั้ง จากนั้นจึงใช้คำสั่ง das การปรับค่าทำกลับกับ daa (ดู sheet)

การคูณเลข Unpacked BCD ต้องใช้คำสั่ง mul มาก่อน โดยมี al เป็นตัวตั้ง จากนั้นจึงใช้คำสั่ง aam คำสั่ง AAM จะเปลี่ยนค่าของผลลัพธ์ของการคูณเลขขนาดไบต์ เป็นค่า Unpacked BCD 2 ค่า เก็บใน AH และ AL โดยที่ตัวตั้งและตัวคูณต้องเป็น Unpacked BCD ด้วย ในการปรับค่าผลลัพธ์ คำสั่ง AAM จะหารเรจิสเตอร์ AL ด้วย 10 และเก็บค่าส่วนใน AH ค่าเศษใน AL เช่น Unpacked BCD 09h * Unpacked BCD 07h mov AL,09h ; al = 00001001 mov BL,07h ; bl = 00000111 mul BL ; AH = 00000000 AL = 00111111 แปลงค่าใน AX เป็นฐานสิบ คือ 63 aam ; AL/10 เก็บ quotient ใน AH = 00000110 และ เศษใน AL = 00000011 ; AX = 0603h unpacked BCD หมายเหตุ สำหรับ ASCII ให้ and ด้วย 0fh ก่อนเพื่อเปลี่ยน ASCII ให้เป็น Unpacked BCD และคำตอบ or ด้วย 3030h เพื่อเปลี่ยนให้เป็น ASCII

การหารเลข Unpacked BCD ให้เก็บตัวตั้ง Unpacked BCD ใน AX ก่อน แล้วใช้คำสั่ง aad จากนั้นจึงใช้คำสั่ง div คำสั่ง AAD จะปรับค่าของตัวตั้งในการหารให้เป็นเลขฐานสอง โดยการคูณส่วนบนของตัวตั้งหรือค่าในเรจิสเตอร์ AH ด้วย 10 และบวกผลลัพธ์กับส่วนล่างของตัวตั้งหรือค่าในเรจิสเตอร์ AL แล้วทำให้ค่าใน AH เป็น 0 เช่น Unpacked BCD 0307h / Unpacked BCD 05h mov cl,05h ; ตัวหาร unpacked BCD 05h mov ax,0307h ; ตัวตั้ง unpacked BCD 0307h aad ; ปรับค่า (AH=3)*10+(AL=7) => AX = 0025h div cl ; al เก็บ quotient = 07h unpacked BCD ; ah เก็บ remainder = 02h unpacked BCD

หมายเหตุ กรณี ASCII ให้ใช้คำสั่ง and ax,0f0fh ก่อน aad เพื่อเปลี่ยน ASCII ให้เป็น Unpacked BCD และ or ด้วย 30h ที่ quotient และ remainder เพื่อเปลี่ยนเป็น ASCII