【问题标题】:Why is my data segment clashing with my code segment?为什么我的数据段与我的代码段冲突?
【发布时间】:2021-04-23 20:05:45
【问题描述】:

我这里有一个程序,它将两个用户输入的数字相除并显示商。该程序已经运行良好并产生了正确的结果,但是当我添加数据段时,它没有显示商,而是显示大写的“T”。我试过单步执行它,并注意到 AX 寄存器的值在打印 MSG3 之前发生了变化。我希望能够添加字符串Input First Number 等,但过程中的某些东西似乎弄乱了代码。我该如何解决这个问题?

代码如下:

.MODEL SMALL
 
READ MACRO MSG
    MOV AH,0AH
    LEA DX,MSG
    INT 21H
ENDM

PRINT MACRO MSG
    MOV AH,09H
    LEA DX,MSG
    INT 21H
ENDM

.DATA 
 
 CR EQU 0DH
 LF EQU 0AH
    MSG1 DB "Enter First Digit: $"
    MSG2 DB CR,LF,"Enter Second Digit: $"
    MSG3 DB CR,LF,"The Quotient is: $"

BUFF DB 2  
DB 3 DUP ('$')
DATA ENDS

.CODE
ASSUME CS:CODE,DS:DATA 

    MAIN PROC
        MOV AX,DATA
        MOV DS,AX
    
        PRINT MSG1
        
        MOV AH,1
        INT 21H      ;Dividend
        MOV BH,AL
        SUB BH,48    ;Convert to decimal no        
        
        PRINT MSG2
        
        MOV AH,1
        INT 21H      ;Divisor
        MOV BL,AL
        SUB BL,48
        
        MOV CL,BH    ;Move dividend to cl reg
        MOV CH,00    ;Empty register?
        MOV AX,CX    ;Move 16bit to 16bit reg
        
        DIV BL       ;AX/BL
        AAD          ;Stop dividing. ASCII adjust AX before division. Clears AH reg       
        
        PRINT MSG3
        
        ADD AL,48
        MOV AH,2
        MOV DL,AL    ;Print
        INT 21H
        
        EXIT:
        MOV AH,4CH
        INT 21H
        
    MAIN ENDP
    
END MAIN 

【问题讨论】:

  • 我可以用什么注册表存储数据?
  • 非常感谢@MichaelPetch,你真的帮助我更多地理解了这一点:)

标签: assembly dos x86-16 emu8086


【解决方案1】:

打印T 的原因是因为Int 21h/AH=9h DOS 函数调用正在用$ 字符破坏AL 中的值。

DOS 1+ - WRITE STRING TO STANDARD OUTPUT
AH = 09h
DS:DX -> '$'-terminated string

Return:
AL = 24h (the '$' terminating the string, despite official docs which
state that nothing is returned) (at least DOS 2.1-7.0 and
NWDOS)

AL 中返回值 24h,然后将 30h(48) 添加到它以得到 54h。字母T 是 54h,这是打印的字符。您需要将要保留的值放入Int 21h/AH=9h DOS 函数调用未使用的寄存器中。任何未使用的 8 位寄存器都足够了,例如 BL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多