这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 两道简单的汇编题,还望大侠帮忙

共2条 1/1 1 跳转至

两道简单的汇编题,还望大侠帮忙

院士
2006-09-17 18:14:16     打赏
两道简单的汇编题,还望大侠帮忙



关键词: 两道     简单     汇编     大侠     帮忙    

院士
2006-12-22 22:43:00     打赏
2楼
问 单位马上要考试了,因为很多年没用这方面东西了,有2道题必出的考题自己不能肯定,还求各位大侠援手帮个忙。
要求用51的汇编语言写,路过的大侠要是工作忙,您给点拨一下思路或者提示一下容易出错的地方也好。

1:从aa存储单元开始存放有32个单字节无符号数,用51的汇编语言编写程序求32个数的平均值,结果存放AVR单元

2:自单元bb开始存放有一个字符串(以$结尾),用51汇编程序编写程序统计数字字符0---9的个数

万分感谢 1: 题目不难自己考虑吧。 2: 晕,老大,就不能给点提示阿 3: 我试试      MOV DPTR,AA
      MOV R1,#32H
      MOV B,#00H
LOOP1:MOV A,#00H
      ADDC A,DPTR
      ADDC A,B
      MOV B,A
      INC DPTR
      DJNZ R1, LOOP1
      MOV A,B
      DIV A,#32
      AJMP $ 4: 谢谢06202105,我看懂了,很多年没用都忘光了那32个字节的和存在累加器会溢出么?
是不是要用双字节的加法和除法啊?
不好意思,我概念有点混乱

还有那位大虾能帮忙给些提示阿? 5: 我自己做了一下第一题,不知道对不对我自己做了一下第一题,不知道对不对。
我在这里的一个概念有些糊涂,上面那位朋友写的程序加的和会不会溢出呢?
要是会溢出只能用双字节加法,可这样除法也要双字节,似乎很麻烦了,除法的程序我真么做似乎还有一个缺点,没有余数了。
大人帮忙看看阿

SUN:    MOV    R0,#32        ;R0存数字个数
    MOV     R2,#00H    ;R2,R3存双字节和
    MOV    R3,#00H
    MOV    R4,#AAH        ;R4存首地址
LOOP:    MOV    A,R4    
    ADD    A,@R4        ;求和
    MOV    R3,A
    CLR    A
    ADDC    A,R2
    MOV    R2,A
    DJNZ    R0,LOOP
    
LOOP2:    MOV    R1,#05H
    CLR    C
    RRC    R2
    RRC    R3    ;除一次2
    CLR    C
    DJNZ    R1,LOOP2    ;除32等于除5次2
    END 6: 我们大学教材上好像都有类似的题目 7: 那你帮我找找看啊 8: 昨天做的不对,又修改了一下,大人帮忙看看还有错嘛昨天做的不对,又修改了一下,大人帮忙看看还有错嘛
第二题没人能给些提示么?

SUN:    MOV    R5,#32        ;R0存数字个数
    MOV     R1,#00H    ;R2,R3存双字节和
    MOV    R2,#00H
    MOV    R0,#AAH        ;R4存首地址
LOOP:    MOV    A,R0    
    ADD    A,@R0        ;求和
    MOV    R1,A
    CLR    A
    ADDC    A,R2
    MOV    R2,A
    DJNZ    R5,LOOP
    
LOOP2:    MOV    R6,#05H
    MOV    R7,#00H    
    CLR    C
    RRC    R2
    RRC    R3    ;除一次2
    RRC    R7
        
DJNZ    R6,LOOP2    ;除32等于除5次2
    MOV    A,R7
    SWAP    A
    MOV    R7,A
    RR    R7
    END
    最后结果,R3中是商,R7中是余数     9: 第二题这样做行么?似乎很笨的做法,还有什么其他方法么?ascii    A=41,a=97,0=30,$=24
    MOV    DPL,#BBH
LOOP:    MOVX    A,@DPTR
    CJNE    A,#30H,A0
    AJMP    SUN
A0:    CJNE    A,#31,A1
    AJMP    SUN
A1:    CJNE    A,#31,A2
    AJMP    SUN    
继续一直到39    
INC    DPTR
    JMP    LOOP

SUN:    INC,R1    ;R1中存统计数字
    JMP,LOOP 10: 我做的试试第二题    MOV    A,#0BBH
    MOV    R0,A
     MOV    R1,#0H;count data
LOOP1:    MOV    A,@R0
          SUBB     A,#30H
    JC    LOOP2
    MOV    A,@R0
    SUBB    A,#3aH
    JNC    LOOP2
    INC    R1; the data is from 0 to 9
LOOP2:    MOV    A,@R0
    INC     R0
    CJNE    A,#24H,LOOP1
         AJMP     $ 11: 06202105,你的DPTR只取了一次值啊? 12: 楼主有兴趣的话自己装一个keil玩玩 13: 谢谢水星,最后写成这样,各位大大看看还有错误么?

谢谢水星,我原来的办法比较笨,还是你的比较明晰
不过JC和JNC的2句我换了一下次序,好像觉得应该是先去掉比30小的,然后再去掉比39大的,不知道这样对么

最后两个程序如下,还有哪位大大帮忙看看有没其他的错误,先谢谢了
************************
    
    MOV    A,#0BBH    
        MOV    R0,A
         MOV    R1,#0H;count data
LOOP1:  MOV    A,@R0
        SUBB   A,#30H
        JNC    LOOP2        ;小于30跳LOOP2
        MOV    A,@R0
        SUBB   A,#3aH    ;大于3A跳LOOP2
        JC     LOOP2
        INC    R1; the data is from 0 to 9
LOOP2:  MOV    A,@R0
        INC    R0
        CJNE   A,#24H,LOOP1
        AJMP   $

****************************
SUN:    MOV    R5,#32        ;R5存数字个数
        MOV     R1,#00H    ;R1,R2存双字节和
        MOV    R2,#00H
        MOV    R0,#AAH        ;R0存首地址
LOOP:   MOV    A,@R0          ;取数字
        ADD    A,R1        ;求和
        MOV    R1,A
        CLR    A
        ADDC   A,R2
        MOV    R2,A
    INC    R0
        DJNZ    R5,LOOP
    
LOOP2:    MOV    R6,#05H
        MOV    R7,#00H    
        CLR    C
        RRC    R2
        RRC    R3    ;除一次2
        RRC    R7
        
DJNZ    R6,LOOP2    ;除32等于除5次2
        RR    R7
        RR        R7
    RR    R7
        END
    最后结果,R3中是商,R7中是余数
14: 这种算法早溢出了 15: 可能的标准答案1.
         AA  EQU 30H ; 32 BYTES ; 30H TO 4FH
         AVR DATA 50H
        
         MOV R0, #AA
         MOV R2, #32
         CLR A
         MOV AVR, A
         CLR C
         ; MOV A, #(32/2)

LP1:
           ADDC A, @R0
           JNC NEXT1
             INC AVR
NEXT1:
         DJNZ R2, LP1
        
         MOV R2, A
         ANL A, #1FH
         XCH A, R2
         ANL A, #11100000B
         SWAP A
         RR A
         XCH A, AVR
         SWAP A
         RR A
         ORL A, AVR
         MOV AVR, A
          

2.
         BB EQU 40H
         RESULT EQU 30H  ; 30H TO 39H

         CLR A
         MOV R1, #10
         MOV R0, #RESULT
LP1:
           MOV @R0, A
           INC R0
         DJNZ R1, LP1

         MOV R1, #(BB-1)
LP2:       
           INC R1
           MOV A, @R1
           CJNE A, #'$', $+5
             SJMP EXIT
           CLR C
           SUBB A, #'0'
           JC LP2
           SUBB A, #10
           JNC LP2
           ADD A, #(10+RESULT)
           MOV R0, A
           INC @R0
         SJMP LP2
EXIT:





16: 你的想法是对了,但是JC和JNC这两句不能交换当 被减数A 小于 减数#30H 的时候“ SUBB   A,#30H ” 导致C bit被置位。
此时跳转当然是使用 JC LOOP2咯 17: 22。
    
    mov r0, #bb
    mov b, #0
loop:
    mov a, @r0
    inc r0
    cjne a, '$', loopCon
    mov a, b
    ret
loopCon:
    cjne a, '0', NotEqu0
NotEqu0:
    jnc loop
    cjne a, '9', NotEqu9
NotEqu9:
    jc loop  
    inc b
    sjmp loop   18: 我的看法以上程序全是错的,没有一位有实际经验的。很遗憾。 19: 怎么没考虑溢出呢?建议和接近256时除于32,接着把剩下的数重新求和再除于32.结果相加即可.

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]