首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fibonacci x86-16装配

Fibonacci x86-16装配
EN

Stack Overflow用户
提问于 2017-09-14 04:57:07
回答 2查看 1.2K关注 0票数 1

我试图在调试x86-16 dosbox汇编程序时执行斐波纳奇序列,但我遇到了麻烦,我一直得到这个奇怪的打印输出:

我试着一片片地把它拆开,但到目前为止,我的情况是这样的。

代码语言:javascript
复制
mov cx, 15
mov al, 01
mov bl, 00
cmp cl, 1
je  010B     ;next line with mov ah, 2
mov ah, 2
int 21
inc cl
cmp cl,2
je  0115     ;next line with mov ah, 2
mov ah, 2
int 21
inc cl
add al, bl
mov bl, al
mov cl, bl
mov ah,2
int 21
loop (inc cl line)
rcx 
4A
w
q

我不确定它是否正确,但它应该打印出斐波纳契序列中的前20个数字,如果可以的话,请提供帮助

编辑:我用

代码语言:javascript
复制
mov cx, 15
dec cx
mov al, 30
mov bl, 31
mov cl, 31
cmp cl, 31
je 010F
mov dl, al
mov ah, 2
int 21
dec cx
inc cl
cmp cl, 32
je 011c
mov dl, bl
mov ah, 2
dec cx
inc cl
int 21
int 20

现在我只需要有ax=bl+al、al=bl和bl=ax,知道如何做到这一点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-15 05:51:29

现在我只需要有ax=bl+al、al=bl和bl=ax,知道如何做到这一点吗?

对于al=bl和bl=al,可以使用exchange指令:

代码语言:javascript
复制
        xchg    al,bl

除了您需要使用16位寄存器才能达到fib(24) (46368),因此:

代码语言:javascript
复制
        add     ax,bx
        xchg    ax,bx

或者,您可以先做xchg。

代码语言:javascript
复制
        xchg    ax,bx
        add     ax,bx

您需要使用除ax之外的寄存器,因为它需要将二进制转换为十进制,并用于int 21调用。

如果您还没有这样做,您可以通过重定向输入以从文本文件读取它的命令来使用debug.com作为一个简单的汇编程序。这些命令将输入指令和数据,然后使用"n“给出要写入的程序的名称,使用"rcx”将cx设置为要写入的字节数,然后使用"w“命令编写程序。"q“退出调试。

这允许您编辑文本文件,直到程序开始工作为止,而不是直接使用debug输入命令。下面是Fibonacci程序的一个示例输入文件,名为腓16.in:

代码语言:javascript
复制
a100
sub  sp,+10
mov  bp,sp
mov  byte ptr [bp+05],0d
mov  byte ptr [bp+06],0a
mov  byte ptr [bp+07],24
mov  di,ffff
mov  si,0001
mov  cx,0019
mov  bx,000a
xchg si,di
add  si,di
mov  bp,sp
add  bp,+05
mov  ax,si
dec  bp
xor  dx,dx
div  bx
or   dl,30
mov  [bp+00],dl
cmp  bp,sp
jnz  0128
mov  ah,09
mov  dx,sp
int  21
loop 011d
add  sp,+10
mov  ax,4c00
int  21

nfib16.com
rcx
47
w
q

若要“组装”此文件,请输入命令:

代码语言:javascript
复制
debug <fib16.in

这将创建一个名为腓16.com的程序,然后您可以使用或不使用调试来运行该程序。

下面是同一程序的常规程序集版本:

代码语言:javascript
复制
;       Fibonacci
        .model  tiny,c
        .code
        org     0100h
main    proc    far
        sub     sp,16                   ;allocate space for string
        mov     bp,sp
        mov     byte ptr 5[bp],00dh     ;bp[5] = 00d,00a,'$'
        mov     byte ptr 6[bp],00ah
        mov     byte ptr 7[bp],024h
        mov     di,0ffffh               ;fib(-2)
        mov     si,00001h               ;fib(-1)
        mov     cx,25                   ;loop: fib(0) to fib(24)
        mov     bx,10                   ;used to convert to string
main0:  xchg    si,di                   ;fib step
        add     si,di
        mov     bp,sp                   ;display si
        add     bp,5
        mov     ax,si
main1:  dec     bp
        xor     dx,dx
        div     bx
        or      dl,030h
        mov     [bp],dl
        cmp     bp,sp
        jne     main1
        mov     ah,009h
        mov     dx,sp
        int     21h
        loop    main0                   ;loop till done
        add     sp,16                   ;restore sp
        mov     ax,04c00h               ;exit
        int     21h
main    endp
        end     main
票数 1
EN

Stack Overflow用户

发布于 2017-09-14 05:07:52

INT 21h,AH = 02h应该将一个字节输出到标准输出,该字节将在DL寄存器中传递。您的代码甚至从未初始化DL,因此它输出垃圾并不奇怪。

你还有其他几个问题。如果您想要可读的输出,就必须进行二进制到十进制的转换,然后再转换为ASCII;您的代码似乎根本不想这样做。另外,你在8位AL,BL寄存器中做所有的算术,但是第20个斐波那契数大于8位,所以在某个时候它会溢出,你将得不到正确的答案。

最后,如果您想用汇编语言编写一个真正的程序,那么调试是一种非常不方便的方法。它已经近40年没有进化了。获得一个真正的文本编辑器和一个真正的汇编程序,以及一个真正的调试器。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46210819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档