งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

CS Assembly Language Programming

งานนำเสนอที่คล้ายกัน


งานนำเสนอเรื่อง: "CS Assembly Language Programming"— ใบสำเนางานนำเสนอ:

1 CS344-321 Assembly Language Programming
Period 23

2 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 เป็นต้น

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

4 หมายเหตุ คำสั่งของ 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 ให้ถูกต้อง จะได้ h เก็บใน ax หมายเหตุ ค่าใน ax ไม่ใช่ ASCII ตามที่ต้องการแต่เป็น Unpacked BCD ถ้าต้องการให้ถูกต้อง ต้องใช้คำสั่ง or ax,3030h อีกคำสั่งหนึ่ง

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

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

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

8 คำสั่ง 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 เสมอ

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

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

11 การบวกเลข 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 หรือไม่ ถ้าใช่ แสดงว่ามีตัวทด

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

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

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

15 การคูณเลข 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 = mov BL,07h ; bl = mul BL ; AH = AL = แปลงค่าใน AX เป็นฐานสิบ คือ 63 aam ; AL/10 เก็บ quotient ใน AH = และ เศษใน AL = ; AX = 0603h unpacked BCD หมายเหตุ สำหรับ ASCII ให้ and ด้วย 0fh ก่อนเพื่อเปลี่ยน ASCII ให้เป็น Unpacked BCD และคำตอบ or ด้วย 3030h เพื่อเปลี่ยนให้เป็น ASCII

16 การหารเลข 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

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


ดาวน์โหลด ppt CS Assembly Language Programming

งานนำเสนอที่คล้ายกัน


Ads by Google