汇编实验作业 一 8086 汇编 寻找并输出水仙花数

来源:互联网 发布:能至网络瘫痪的攻击 编辑:程序博客网 时间:2024/05/21 01:56

汇编实验作业(一)

注:水仙花数指的是每一个十进制位的立方加起来等于他自身的三位数,水仙花数本身就是三位数- -范围100-999,可以遍历来做

之前想的是每一位的数在1-9之间选,再通过每位分别乘以100,10,1转化再与自身比较,如果可以循环多但是代码少效率高,可是不太会写,

下面是遍历100-999的数,看是否满足水仙花数条件,输出水仙花数

注意循环嵌套时一些变量初始值的改变,如这里si,flag1【也许这里不应该称之为变量,暂时这样说吧】

做的时候这两个值发生了改变导致不好找错误,然后发现两次循环(包含一个水仙花数)可以正常输出,三次及以上不行找到了这错误。


<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:14px;">data segmentflag1 db 0flag2 db 0outt db 'shuixianhua: ','$'array0 dw 3 dup(0)<span style="color:#33CC00;">;保存三位数的每一位的三次方</span>data endsstack segmentstack endscode segmentassume cs:code,ds:data,ss:stackbegin:  mov ax,data           mov ds,ax             lea dx,outt           mov ah,9           int 21h           mov cx,1000        x1:     mov si,0<span style="color:#33CC00;">;同样也是一直没发现的错误,错误原因差不多</span>         dec cx <span style="color:#33CC00;">;用cx来计100-999的这1000个数</span>         mov ax,cx;         cmp ax,99         jz endd<span style="color:#33CC00;">;************将这个三位数每一个十进制位算出并入栈保存**********     </span>   x2:     mov bx,10         xor dx,dx         div bx         push dx         cmp ax,0         jnz x2         mov flag1,3;<span style="color:#33CC00;">这里错误一直没有发现,之前直接把flag1定为3以为万事大吉导致下面循环一次过后flag1值变为0,所以说一定要注意变量值再下一次循环需不需要恢复到初始值。;*************计算每位数的立方************        </span>x3:     pop ax         mov bx,ax         mul bl         mul bl         mov word ptr array0[si],ax         add si,2;***********小心别顺手写成inc si************         dec flag1         cmp flag1,0         jnz x3 ;***********计算每位数立方的和************       sum:    mov ax,array0[0]         mov bx,array0[2]        add ax,bx        mov bx,array0[4]        add ax,bx        cmp ax,cx<span style="color:#33CC00;">;这里有两个条件需要暂时终止这个循环一是出现了水仙花数而是三位数遍历完了</span>        mov ax,cx        jnz x1   <span style="color:#33CC00;">;这两个条件如果一起放在最后,处理有点麻烦所以把后面一个判断放在最前面</span>        call output<span style="color:#33CC00;">;//////////////////////////////////////////////</span>        jmp x1                endd:   mov ax,4c00h        int 21h <span style="color:#33CC00;">;将水仙花数转化为10进制输出,如果之前把每一位数保存在数组里的话,可以不用这么繁琐,直接把之前计算的每一位输出就好</span>          output: mov bx,10        xor dx,dx        div bx        push dx        inc flag2        cmp ax,0        jnz output        output0: pop dx         add dx,30h         mov ah,2         int 21h         dec flag2         cmp flag2,0         jnz output0         mov dx,' '         mov ah,2         int 21h         ret         code ends         end begin</span></span>



0 0
原创粉丝点击