Thông báo

Collapse
No announcement yet.

8951: Chia số 16 bit cho số 8 bit dùng assembler

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • 8951: Chia số 16 bit cho số 8 bit dùng assembler

    Em đang có một bài tập nhỏ là chia số 16 bit cho số 8bit:
    - Số 16 bit (gọi là A ) được cất trong 2 thanh ghi 31h (byte cao) và 30h (byte thấp)
    - Số 8 bit ( gọi là B) được cất trong thanh ghi 40h
    - Kết quả sẽ được cất vào 2 thanh ghi 51h(byte cao) và 50h (byte thấp)
    - Viết bằng ngôn ngữ Asembler (cái chính là trình bày giải thuật của đoạn code)
    Các sư huynh chỉ giúp em cách làm với, cái này em có thể tìm trong sách nào vậy ạ?

  • #2
    Cái này mình viết bằng assembly, chịu khó đọc tiếng anh đi.
    Code:
    TEST:		MOV B,#08H		; Load counter 8dec 
    		MOV A,DEN		; Load Acc with Divisor (Denominator)
    		CLR C			; Clear Carry
    		SUBB A,NUM_H		; If NUM_H greater than DEN,
    		JC EXIT			; Exit, result won't fit in 8bit reg
    		CLR C			; Clear Carry
    
    DIVIDE:		MOV A,NUM_L		; Load Acc with NUM_L
    		RLC A			; x 2
    		MOV NUM_L,A		; Save new value back NUM_L
    		MOV A,NUM_H		; Load Acc with NUM_H
    		RLC A			; x 2
    		MOV NUM_H,A		; Save new value back NUM_H
    		JC SUBTRACT		; Jump Carry
    		MOV A,DEN		; Load Acc with DEN
    		SUBB A,NUM_H		; Compare if DEN > NUM_H
    		JNC NEXT		; NUM_H < than DEN 
    		CLR C			; Clear Carry
     		
    SUBTRACT:	MOV A,NUM_H		; Load Acc with NUM_H
    		SUBB A,DEN		; Subtract DEN from NUM_H
    		MOV NUM_H,A		; Save NUM_H back
    		SETB C			; Set Carry (Divide one time)
    
    NEXT:		DJNZ B,DIVIDE		; Decrease pointer 		
    		MOV A,NUM_L		; Load Acc with NUM_L (quotient with C)
    		RLC A			; Shift out Carry
    		MOV Q,A			; Get the quotient
    
    EXIT:           RET                     ;
    Đây là link mình post bên 8052.com
    http://www.8052.com/forum/read.phtml?id=91847
    8052 code library link:
    http://www.8052.com/codelib.phtml
    Zilog application notes 16bit/8bit routine link:
    http://www.zilog.com/products/partdetails.asp?id=Z86C93

    Comment


    • #3
      Huynh có thể nói cho đệ cách làm không vậy? Đệ đọc mà thấy không hiểu?

      Comment


      • #4
        Đoạn code của thelam rõ ràng quá roài còn gì nữa, chỉ cần hiểu tiếng anh là okie.nếu hong hiểu chỗ nào tui có thể giúp bác...dịch tiếng anh! Vừa có code vừa có chú thích nữa kìa, bác may qua còn gì. Tui đang nhờ mấy cao thủ viết dùm đoạn code điều chỉnh độ rộng xung mà hong thấy ai giúp tui nè. hic !

        Comment


        • #5
          cam on nha

          Comment


          • #6
            Nguyên văn bởi ronalpires Xem bài viết
            Em đang có một bài tập nhỏ là chia số 16 bit cho số 8bit:
            - Số 16 bit (gọi là A ) được cất trong 2 thanh ghi 31h (byte cao) và 30h (byte thấp)
            - Số 8 bit ( gọi là B) được cất trong thanh ghi 40h
            - Kết quả sẽ được cất vào 2 thanh ghi 51h(byte cao) và 50h (byte thấp)
            - Viết bằng ngôn ngữ Asembler (cái chính là trình bày giải thuật của đoạn code)
            Các sư huynh chỉ giúp em cách làm với, cái này em có thể tìm trong sách nào vậy ạ?
            bạn có thể tham khảo thêm ở đây nha, chương trình này là 2 số 16 bit.
            http://08tdt.com/forum/showthread.php?t=228&page=4

            Comment


            • #7
              Nguyên văn bởi ronalpires Xem bài viết
              Em đang có một bài tập nhỏ là chia số 16 bit cho số 8bit:
              - Số 16 bit (gọi là A ) được cất trong 2 thanh ghi 31h (byte cao) và 30h (byte thấp)
              - Số 8 bit ( gọi là B) được cất trong thanh ghi 40h
              - Kết quả sẽ được cất vào 2 thanh ghi 51h(byte cao) và 50h (byte thấp)
              - Viết bằng ngôn ngữ Asembler (cái chính là trình bày giải thuật của đoạn code)
              Các sư huynh chỉ giúp em cách làm với, cái này em có thể tìm trong sách nào vậy ạ?
              mình làm theo giải thuật này nè:
              chia thực chất là trừ thôi, bạn viết 1 chương trình trừ 2 số 16bit, cái này chắc là dễ với bạn phải ko? khi muốn chia 2 số 16 bit hoặc chia 1 só 16 bit cho 1 số 8bit chỉ cần cho 2 số này trừ với nhau, mỗi lần trừ thì kết quả tăng lên 1 rồi kiểm tra kết quả có bị tràn ko, nếu tràn thì tăng byte cao của kết quả lên 1, đến khi trừ hết được thì kết quả là thương đấy và số thứ nhất chính là số dư .
              hãy cố gắng dù vướn phải thất bại!!!!!!!!

              Comment


              • #8
                Hộ em luôn bài này với các bác ơi
                Viết chương trình con tạo checksum n byte trong bộ nhớ (n<65536) bằng ADD
                DPTR = địa chỉ đầu ô nhớ
                R2(H) , R3(L) = độ dài
                Checksum trong A
                R1 dùng để cộng các giá trị với A
                ;;;;;;;Làm ơn chú thích rõ ràng giùm nhá.Thankssssssss.

                Comment


                • #9
                  mình đang làm bài tập về Asembler có 1 bài toán là hãy vẽ mô phỏng chuyển động của chiếc xe đạp . ai biết thì cho mình với. hicc hiccc

                  Comment


                  • #10
                    Nguyên văn bởi thaiytq2010 Xem bài viết
                    mình đang làm bài tập về Asembler có 1 bài toán là hãy vẽ mô phỏng chuyển động của chiếc xe đạp . ai biết thì cho mình với. hicc hiccc
                    lộn chủ đề rồi cậu!

                    Comment


                    • #11
                      Chủ đề này còn ai tiếp tục ko nhỉ?????
                      Mình dùng code chia 16bit như của anh thelam đó nhưng khi mô phỏng thì đc còn ra mạch thực tế thì không đc hic hic!

                      Comment


                      • #12
                        Mình có 1 bài toán, cũng nhân chia mà ko thể xử lsy đc, ai giúp mình với nào.

                        Mình có 1 dải số A : 0-255

                        Mình cần hiển thị dải số này lên led 7 từ 0-99

                        Như vậy hệ số để hiển thị sẽ là 256/100=2,56
                        Mình tính dùng :
                        Mov A,#256
                        mov B,#2,56
                        div AB

                        Khổ nỗi B=2,56 ko thể đc. Chỉ có thể là số nguyên.
                        1 phương án khác đặt ra là A*100/256. Lại khổ nỗi phép nhân " mul AB" Cho 8 bit thấp cho A, 8 bit cao cho B. Đành pó tay.

                        Anh em cho cách giải quyết

                        Comment


                        • #13
                          Nguyên văn bởi kissyou Xem bài viết
                          Mình có 1 bài toán, cũng nhân chia mà ko thể xử lsy đc, ai giúp mình với nào.

                          Mình có 1 dải số A : 0-255

                          Mình cần hiển thị dải số này lên led 7 từ 0-99

                          Như vậy hệ số để hiển thị sẽ là 256/100=2,56
                          Mình tính dùng :
                          Mov A,#256
                          mov B,#2,56
                          div AB

                          Khổ nỗi B=2,56 ko thể đc. Chỉ có thể là số nguyên.
                          1 phương án khác đặt ra là A*100/256. Lại khổ nỗi phép nhân " mul AB" Cho 8 bit thấp cho A, 8 bit cao cho B. Đành pó tay.

                          Anh em cho cách giải quyết
                          Dua bai lên đi

                          Comment


                          • #14
                            Nguyên văn bởi mr.ngoc Xem bài viết
                            Chủ đề này còn ai tiếp tục ko nhỉ?????
                            Mình dùng code chia 16bit như của anh thelam đó nhưng khi mô phỏng thì đc còn ra mạch thực tế thì không đc hic hic!
                            Ban up bai hoan chinh cua de minh xem nao?

                            Comment


                            • #15
                              có thể giải thích rõ: DEN, num_l, num_h là gì đc ko?

                              Comment

                              Về tác giả

                              Collapse

                              ronalpires Tìm hiểu thêm về ronalpires

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X