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

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

CS344-321 Assembly Language Programming Period 23.

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


งานนำเสนอเรื่อง: "CS344-321 Assembly Language Programming Period 23."— ใบสำเนางานนำเสนอ:

1 CS Assembly Language Programming Period 23

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

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

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

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

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

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

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

11 การบวกเลข Packed BCD ต้องใช้คำสั่ง add หรือ adc มาก่อน โดยมี al เป็นตัวตั้ง จากนั้นจึงใช้คำสั่ง daa ต้องใช้คำสั่ง add หรือ adc มาก่อน โดยมี al เป็นตัวตั้ง จากนั้นจึงใช้คำสั่ง daa DAA ใช้สำหรับปรับค่าของการบวก packed BCD วิธีการปรับค่าของคำสั่ง 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 = 1 CF = 0

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

15 การคูณเลข Unpacked BCD การคูณเลข Unpacked BCD ต้องใช้คำสั่ง mul มาก่อน โดยมี al เป็นตัวตั้ง จากนั้นจึง ใช้คำสั่ง aam ต้องใช้คำสั่ง mul มาก่อน โดยมี al เป็นตัวตั้ง จากนั้นจึง ใช้คำสั่ง aam คำสั่ง AAM จะเปลี่ยนค่าของผลลัพธ์ของการคูณ เลขขนาดไบต์ เป็นค่า Unpacked BCD 2 ค่า เก็บใน AH และ AL โดยที่ตัวตั้งและตัวคูณต้องเป็น Unpacked BCD ด้วย คำสั่ง 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 และคำตอบ or ด้วย 3030h เพื่อเปลี่ยนให้เป็น ASCII

16 การหารเลข Unpacked BCD การหารเลข Unpacked BCD ให้เก็บตัวตั้ง Unpacked BCD ใน AX ก่อน แล้วใช้คำสั่ง aad จากนั้นจึงใช้คำสั่ง div ให้เก็บตัวตั้ง Unpacked BCD ใน AX ก่อน แล้วใช้คำสั่ง aad จากนั้นจึงใช้คำสั่ง div คำสั่ง AAD จะปรับค่าของตัวตั้งในการหารให้เป็น เลขฐานสอง โดยการคูณส่วนบนของตัวตั้งหรือค่าในเรจิ สเตอร์ AH ด้วย 10 และบวกผลลัพธ์กับส่วนล่างของตัวตั้ง หรือค่าในเรจิสเตอร์ AL แล้วทำให้ค่าใน AH เป็น 0 คำสั่ง 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 CS344-321 Assembly Language Programming Period 23.

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


Ads by Google