斐波那契 x86-16 大会
Fibonacci x86-16 Assembly
我正在尝试在调试 x86-16 dosbox 汇编程序中执行斐波那契序列,但我遇到了麻烦,我一直收到这个奇怪的打印输出:
我试着把它一点一点地分解,但这是我目前所拥有的
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 个数字,如果可以请帮忙
编辑:
我使用
打印 01
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,知道怎么做吗?
INT 21h, AH = 02h 应该将一个字节输出到标准输出,该字节将在 DL 寄存器中传递。您的代码甚至从未初始化 DL,因此它输出垃圾也就不足为奇了。
你还有其他几个问题。如果您想要可读的输出,您必须进行二进制到十进制的转换,然后再转换为 ASCII;您的代码似乎甚至没有尝试这样做。另外,你所有的运算都是在8位的AL、BL寄存器中进行的,但是第20个斐波那契数大于8位,所以在某些时候它会溢出,你得不到正确的答案。
最后,如果你想用汇编语言编写一个真正的程序,那么 DEBUG 是一种非常不方便的进行方式。它已经近 40 年没有进化了。获得一个真正的文本编辑器和一个真正的汇编器,以及一个真正的调试器。
now i just need to have ax=bl+al, al=bl, and bl=ax, any idea on how to do that?
对于al=bl和bl=al,可以使用交换指令:
xchg al,bl
除了你需要使用 16 位寄存器才能达到 fib(24) (46368),所以那将是:
add ax,bx
xchg ax,bx
您可以选择先执行 xchg。
xchg ax,bx
add ax,bx
您需要使用 ax 以外的寄存器,因为需要它来将二进制转换为十进制以及调用 int 21。
如果您还没有这样做,您可以将 debug.com 用作粗略的汇编程序,方法是重定向其输入以从文本文件中读取它的命令。命令将输入指令和数据,然后使用"n" 给出要写入的程序的名称,"rcx" 将cx 设置为要写入的字节数,然后使用"w" 命令写入该程序。 "q" 退出调试。
这允许您编辑文本文件直到程序运行,而不是直接使用调试输入命令。这是名为 fib16.in:
的斐波那契程序的示例输入文件
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
到"assemble"这个文件输入命令:
debug <fib16.in
这将创建一个名为 fib16.com 的程序,然后您可以 运行 调试或不调试。
这是同一程序的常规汇编版本:
; 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
我正在尝试在调试 x86-16 dosbox 汇编程序中执行斐波那契序列,但我遇到了麻烦,我一直收到这个奇怪的打印输出:
我试着把它一点一点地分解,但这是我目前所拥有的
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 个数字,如果可以请帮忙
编辑: 我使用
打印 01mov 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,知道怎么做吗?
INT 21h, AH = 02h 应该将一个字节输出到标准输出,该字节将在 DL 寄存器中传递。您的代码甚至从未初始化 DL,因此它输出垃圾也就不足为奇了。
你还有其他几个问题。如果您想要可读的输出,您必须进行二进制到十进制的转换,然后再转换为 ASCII;您的代码似乎甚至没有尝试这样做。另外,你所有的运算都是在8位的AL、BL寄存器中进行的,但是第20个斐波那契数大于8位,所以在某些时候它会溢出,你得不到正确的答案。
最后,如果你想用汇编语言编写一个真正的程序,那么 DEBUG 是一种非常不方便的进行方式。它已经近 40 年没有进化了。获得一个真正的文本编辑器和一个真正的汇编器,以及一个真正的调试器。
now i just need to have ax=bl+al, al=bl, and bl=ax, any idea on how to do that?
对于al=bl和bl=al,可以使用交换指令:
xchg al,bl
除了你需要使用 16 位寄存器才能达到 fib(24) (46368),所以那将是:
add ax,bx
xchg ax,bx
您可以选择先执行 xchg。
xchg ax,bx
add ax,bx
您需要使用 ax 以外的寄存器,因为需要它来将二进制转换为十进制以及调用 int 21。
如果您还没有这样做,您可以将 debug.com 用作粗略的汇编程序,方法是重定向其输入以从文本文件中读取它的命令。命令将输入指令和数据,然后使用"n" 给出要写入的程序的名称,"rcx" 将cx 设置为要写入的字节数,然后使用"w" 命令写入该程序。 "q" 退出调试。
这允许您编辑文本文件直到程序运行,而不是直接使用调试输入命令。这是名为 fib16.in:
的斐波那契程序的示例输入文件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
到"assemble"这个文件输入命令:
debug <fib16.in
这将创建一个名为 fib16.com 的程序,然后您可以 运行 调试或不调试。
这是同一程序的常规汇编版本:
; 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