注册 登录
编程论坛 汇编论坛

有一些问题 在汇编学习中

万万切克闹 发布于 2015-06-10 17:03, 4753 次点击
只有本站会员才能查看附件,请 登录
如图所示 我想了好久 也编了一部分程序 但是不成功 求指导
11 回复
#2
hu9jj2015-06-10 18:57
现在真先进,发贴都用不着打字了。
#3
取名字2015-06-10 22:16
不知道对于楼主的意思理解的对不对,下面是编译成功的程序:
assume  cs:code,ds:data
data    segment
        f1      db      1
        f2      db      2
        fnext   db      8       dup     (?)
        sum     db      ?
        table   dw      4       dup     (?)
data    ends
code    segment
sum_fabonaci    proc
        push    bx
        push    cx

        mov    al,[bx]
        mov    cx,7
s1:
        inc    bx
        add    al,[bx]
        loop    s1
   
        pop    cx
        pop    bx
        ret
sum_fabonaci    endp

fabonaci        proc
        push    si
        push    di
        push    ax
        push    bx
        push    cx

        mov     si,[bx]
        mov     al,[si]
        mov     si,[bx+2]
        mov     ah,[si]
        mov     di,[bx+4]
        mov     [di],al
        mov     [di+1],ah        //以上指令实现将F1,F2的值存入fnext中,方便后面计算fabonaci数列。
        inc     di
        
        mov     cx,6
s:
        mov     al,[di-1]
        add     al,[di]
        mov     [di+1],al        //从s标号到这里实现fabonaci数列。
        inc     di
        loop    s

        pop    cx
        pop    bx
        pop    ax
        pop    di
        pop    si
        ret
fabonaci        endp

start:
        mov     ax,data
        mov     ds,ax
        mov    di,0
        mov     ax,offset f1        
        mov     table[di],ax
        mov     ax,offset f2
        mov     table[di+2],ax
        mov     ax,offset fnext
        mov     table[di+4],ax
        mov     ax,offset sum
        mov     table[di+6],ax                //从start标号到这里目的是将F1,F2,fnext,sum的地址存入table中,也可以不这么麻烦,直接在数据段中将这些地址直接存入table中。
        mov     bx,offset table
        call    fabonaci                      //这里将table的地址赋给bx寄存器,然后作为参数传递给子程序fabonaci。
        mov     bx,offset fnext
        call    sum_fabonaci                 //调用求和子程序,结果由al传回。
        mov     sum,al
        mov     ax,4c00h
        int     21h

code    ends
        end     start
#4
万万切克闹2015-06-11 00:08
回复 3楼 取名字
谢谢 好人 真的很谢谢
#5
万万切克闹2015-06-11 00:12
回复 3楼 取名字
图中有个错误 f2 db 1这样才是fabonaci  数组 其实还有一个要求是 只要求前10项就可以了,并把总和放在sum里 真心谢谢你 。但是 我这样遍老是出错,求指点迷津
data     segment
         f1   db 1
         f2   db 1
         fnext db 8 dup(?)
         sum db ?
         table dw 4 dup(?)
data     ends
code     segment
         assume cs:code,ds:data
main     proc far
         push ds
         sub  ax,ax
         push ax
         mov ax,data
         mov ds,ax
         mov table,offset f1
         mov table+2,offset f2
         mov table+4,offset fnext
         mov table+6,offset sum
         mov bx,offset table
         call ab
        
         ret
main endp
ab      proc  near
        mov si,[bx]
        mov cx,8
        xor ax,ax
        
p1:     mov ax,[si]
        add bx,ax
        add ax,[si+1]
        mov [si+2],ax
        inc si
        loop p1
        add bx,[si+1]
        add bx,[si+2]
        mov sum,offset bx
        
        
      
        ret
ab      endp
code    ends
        end main


[ 本帖最后由 万万切克闹 于 2015-6-11 00:15 编辑 ]
#6
万万切克闹2015-06-11 00:17
回复 2楼 hu9jj
求解答啊   搞了半天了  其中 f2 db 1  这样才是fabonaci数列 求前10项和  就行了
data     segment
         f1   db 1
         f2   db 1
         fnext db 8 dup(?)
         sum db ?
         table dw 4 dup(?)
data     ends
code     segment
         assume cs:code,ds:data
main     proc far
         push ds
         sub  ax,ax
         push ax
         mov ax,data
         mov ds,ax
         mov table,offset f1
         mov table+2,offset f2
         mov table+4,offset fnext
         mov table+6,offset sum
         mov bx,offset table
         call ab
        
         ret
main endp
ab      proc  near
        mov si,[bx]
        mov cx,8
        xor ax,ax
        
p1:     mov ax,[si]
        add bx,ax
        add ax,[si+1]
        mov [si+2],ax
        inc si
        loop p1
        add bx,[si+1]
        add bx,[si+2]
        mov sum,offset bx
        
        
      
        ret
ab      endp
code    ends
        end main这是我写的不过漏洞百出  请指教
#7
取名字2015-06-11 11:05
p1:     mov ax,[si]
        add bx,ax
        add ax,[si+1]
        mov [si+2],ax
        inc si
        loop p1
        add bx,[si+1]
        add bx,[si+2]
        mov sum,offset bx
bx是传递过来的table的地址,在这个程序段中,“add bx,ax”你用bx作累加器,中间漏了值没加,且bx作为参数本身有一个值,所以这里使用bx累加不对。而后“mov sum,offset bx”这条语句使用错误,对于寄存器不存在取地址。
#8
取名字2015-06-11 11:08
补充说明:楼主最好把遇到的问题,出现的错误都描述清楚,这样才能最快得到有效的解答。
#9
万万切克闹2015-06-11 14:47
回复 8楼 取名字
通过地址表传递地址参数的方法求斐波那契数列前十项和的通用子程序 ,并将和放在sum里面。
data segment
f1 db 1 数列第一项为1
f2 db 2  数列第二项为1
fnext db 8 dup (?) 将后8项的值根据斐波那契数列的特点计算并保存在fnext里面
sum db?   将求得的和放在sum里面
table dw 4 dup(?) 地址表
  麻烦大神 给个程序 我参考一下 我搞了一天了 还是错 麻烦了 
#10
取名字2015-06-11 14:56
我前面的程序不是完成你所列的要求了吗?
#11
取名字2015-06-11 16:56
data     segment
         f1   db 1
         f2   db 1
         fnext db 8 dup(?)
         sum db ?
         table dw 4 dup(?)
data     ends
code     segment
         assume cs:code,ds:data
main     proc far
         push ds
         sub  ax,ax
         push ax
         mov ax,data
         mov ds,ax
         mov table,offset f1
         mov table+2,offset f2
         mov table+4,offset fnext
         mov table+6,offset sum
         mov bx,offset table
         call ab
        
         ret
main endp
ab      proc  near
        mov si,[bx]
        mov cx,8
        xor ax,ax
        
p1:     mov ax,[si]
        add bx,ax
        add ax,[si+1]
        mov [si+2],ax
        inc si
        loop p1
        add bx,[si+1]
        add bx,[si+2]
        mov sum,offset bx
        
        
      
        ret
ab      endp
code    ends
        end main
楼主的这段程序,在main子程序中,还存在堆栈不平衡的问题,开始:
push    ds
...
push    ax
...
后面却没有相应的出栈操作,这会导致程序在返回时出错。
#12
wmf20142015-06-11 17:04
回复 11楼 取名字
如果是子程序,出入栈不平衡会导致ret不到正确的地址,程序会执行乱的。
1