【问题标题】:TASM 8086 output issueTASM 8086 输出问题
【发布时间】: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, primmov ax,[prim] 都加载了 prim 的值
  • 顺便说一句:xor ax,axxor dx,dx 是干什么用的?它们是不需要的,如果你稍后用 2 条指令加载这些寄存器
  • 这些是我解决问题的尝试
  • "s0 db 25 dup(0ah), 'pi= $'" 这一系列的换行符可能会导致一些模拟器无法运行。不要在 EMU8086 上使用它,我看到 25 行屏幕只显示前 24 行。您是否尝试过在不添加此消息的情况下打印结果?

标签: assembly intel x86-16 tasm


【解决方案1】:

您第一次使用CXinc cx。您假设 CX 在开始时为 0。实际上,调试器将其设置为 0。但是,假设是错误的。在.for 之前用xor cx,cx 初始化CX

顺便说一句:不要忘记定义堆栈:

_STACK SEGMENT PARA STACK 'STACK'
    dw  1024 dup (?)
_STACK ENDS

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多