【发布时间】:2015-03-12 17:41:37
【问题描述】:
我是组装新手,我正在尝试创建复制笛卡尔的叶 (x^3 + y^3 - 3*axy = 0 其中 a=12)。我已经完成了代码,当我编译和链接时,我没有收到任何错误。我在 64 位 win8 上通过 DOSBox 0.74 使用 TASM。但是当我尝试通过 DOSBox 执行 folium.exe 文件时,我得到一行随机字符,它说无法在随机字符的中心打开文件。我不知道为什么会这样,根据我的代码它应该显示“0”或“”。要么我组装错误,要么我的代码中有我不知道的错误。
在 DOSBox 0.74 中,我只需输入TASM folium.asm,然后输入LINK folium,然后输入folium 即可执行。这就是我为我的其他代码所做的方式并且它有效。
title folium.asm ; draws the loop in a cubic curve called the folium of Descartes, defined by x^3 + y^3 - 3*a*x*y = 0, where a = 12
.model small
.stack 100h
.data
include const.inc
x dw ?
y dw ?
z dw ?
.code
main proc
; initialize DS
mov ax, @data
mov ds, ax
; y := 0;
mov y, 0
while01: ; y <= 20
cmp y, 20
jnle endwhile01
; do01
; x := 0
mov x, 0
while02: ; x <= 20
cmp x, 20
jnle endwhile02
; do01
; z := x*x*x + y*y*y - 36*x*6
mov ax, x
imul x
imul x
mov z, ax
mov ax, y
imul y
imul y
add z, ax
mov ax, 36
imul x
mov bx, ax
mov ax, 6
imul bx
sub z, ax
; if01 z <= 0
cmp x, 0
jnle else01
then01:
; write '0'
mov ah, dispstr
mov dx, offset '0'
int dosfunc
jmp endif01
else01:
; write ' '
mov ah, dispstr
mov dx, offset ' '
int dosfunc
endif01:
; x := x + 1;
inc x
jmp while02
endwhile02:
; write cr, lf
mov ah, wrchr
mov dl, cr
int dosfunc
mov dl, lf
int dosfunc
; y := y + 1
inc y
jmp while01
endwhile01:
; return -- to DOS
mov ah, ret2dos
int dosfunc
main endp
end main
【问题讨论】:
-
你能显示
dosfunc、wrchr和dispstr的值是什么吗?在您的int dosfunc ; mov dl, lf ; int dosfunc中,您可能应该在第二个int dosfunc之前重新加载mov ah, wrchr,因为尚不清楚int dosfunc在执行时是否会保留ah的值。dispstr是否设置为09h?如果是,则ds:dx需要指向内存中以美元符号终止的字符串 ($)。我认为offset '0'或offset ' '不会在那里工作。您将从内存中这些位置的任何内容中获得一些非常奇怪的输出。