【发布时间】:2017-04-11 23:22:22
【问题描述】:
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
【问题讨论】:
-
我认为我们需要查看分配 prim 的代码。我的 TASM 生锈了,但我不确定“prim”是直接加载值还是“地址”,你也应该检查一下(如果是
[prim]或word ptr prim等) -
刚刚在我的 TASM(v5.0 版)上检查过,
mov ax, prim和mov ax,[prim]都加载了 prim 的值 -
顺便说一句:
xor ax,ax和xor dx,dx是干什么用的?它们是不需要的,如果你稍后用 2 条指令加载这些寄存器 -
这些是我解决问题的尝试
-
"s0 db 25 dup(0ah), 'pi= $'" 这一系列的换行符可能会导致一些模拟器无法运行。不要在 EMU8086 上使用它,我看到 25 行屏幕只显示前 24 行。您是否尝试过在不添加此消息的情况下打印结果?
标签: assembly intel x86-16 tasm