xor ax,ax
xor dx,dx
mov ax,prima
mov dl,al
mov ah,2
int 21h
变量"prima"已经存储了 33h,它应该打印"3",但它没有,如果我正常运行程序,它会打印"0"。让我烦恼的是,我正在使用DOSBox进行调试,如果我按下以查看输出,它会显示"3"(寄存器面板显示AL
为33h(。
以前有人遇到过这个问题吗?代码计算 pi。
data segment
s0 db 25 dup(0ah), 'pi= $'
s1 db 2 dup(0ah), ' $'
n dw 0
z dw 0
r dw 0
o dw 0
j dw 0
x dw 0
y dw 0
xp dw 0
yp dw 0
rp dw 0
cp dw 0
l db 0
css dw 0
patru dw 0
pi dw 0
prima dw 0
adoua dw 0
atreia dw 0
data ends
assume cs:code, ds:data
code segment
start:
mov ax,data
mov ds,ax
mov n,93
mov z,10
mov r,50
mov o,1000
mov j,1
mov ax,n
mov x,ax
mov l,0
mov css,56
mov patru,4
.for:
cmp j,1
jne .if1
mov ax,x
mul x
mov x,ax
cmp x,1000
ja .nrbununu
mov ax,x
mul z
mov x,ax
.nrbununu:
mov ax,x ; x=x%1000/10
xor dx,dx
div o
mov ax,dx
xor dx,dx
div z
mov x,ax ;
mov y,ax ; y=x;
inc j
.if1:
cmp j,2
jne .if2
mov ax,y
mul y
mov y,ax
cmp y,1000
ja .nrbundoi
mov ax,y
mul z
mov y,ax
.nrbundoi:
mov ax,y ; y=y%1000/10
xor dx,dx
div o
mov ax,dx
xor dx,dx
div z
mov y,ax ;
mov ax,x
mul x
mov xp,ax
mov ax,y
mul y
mov yp,ax
mov ax,r
mul r
mov rp,ax ;
mov ax,xp
add ax,yp
cmp ax, rp
ja .contor
inc bl
.contor:
mov j,1
.if2:
inc cx
cmp cx,56
jnle .forx
jmp .for
.forx:
mov ax,bx
mul patru
xor dx,dx
div css
mov prima,ax
add prima,48
mov ax,dx
mul z
div css
mov adoua,ax
add adoua,48
mov ax,dx
mul z
div css
mov atreia,ax
add atreia,48
mov dx, offset s0
mov ah,9
int 21h
xor ax,ax
xor dx,dx
mov ax,prima
mov dl,al
mov ah,2
int 21h
mov dl,2ch
mov ah,2
int 21h
xor ax,ax
xor dx,dx
mov ax,adoua
mov dl,al
mov ah,2
int 21h
xor ax,ax
xor dx,dx
mov ax,atreia
mov dl,al
mov ah,2
int 21h
mov ah,4ch
int 21h
code ends
end start
第一次使用 CX
是 inc cx
。您一开始就假设CX
为 0。实际上,调试器将其设置为 0。但是,这种假设是错误的。在使用 xor cx,cx
.for
之前立即初始化CX
。
顺便说一句:不要忘记定义一个堆栈:
_STACK SEGMENT PARA STACK 'STACK'
dw 1024 dup (?)
_STACK ENDS