TASM 程序不打印任何东西

TASM program not printing anything

我编写了一个程序来计算 TASM 中的整数数组的平均值,但控制台不显示任何内容,即使该算法似乎工作正常。 有人知道问题出在哪里吗?

DATA SEGMENT PARA PUBLIC 'DATA'
msg db "The average is:", "$"
sir db 1,2,3,4,5,6,7,8,9
lng db $-sir
DATA ENDS


CODE SEGMENT PARA PUBLIC 'CODE'
 MAIN PROC FAR
ASSUME CS:CODE, DS:DATA
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX    ;initialization part stops here

mov cx, 9
mov ax, 0
mov bx, 0
sum:
add al, sir[bx]  ;for each number we add it to al and increment the nr of 
  ;repetions
inc bx
loop sum

idiv bx

MOV AH, 09H   ;the printing part starts here, first with the text
LEA DX, msg
INT 21H

mov ah, 02h  
mov dl, al    ;and then with the value
int 21h


ret
MAIN ENDP
CODE ENDS
END MAIN

idiv bxdx:ax 中的 32 位值除以 bx。因此,在除法之前,您需要将 ax 符号扩展为 dx,您可以实现,例如使用 cwd 指令。

另一个问题是,您需要将'0'添加到al(或dl)中的值之前int 21h/ah=02h才能将其转换为字符。请注意,此方法仅适用于个位数的值。


您可能还想将末尾的 ret 更改为 mov ax,4c00h / int 21h,这是退出 DOS 程序的正确方法。

idiv bx

字大小除法会将 DX:AX 除以操作数 BX 中的值。您的代码没有事先设置 DX

这里的最简单解决方案是使用字节大小的除法idiv bl,它将AX除以BL中的值,留下AL 中的商和 AH 中的余数。

数组中非常小的数字加起来是 45。这将导致商为 5,余数为 0。


MOV AH, 09H   ;the printing part starts here, first with the text
LEA DX, msg
INT 21H

mov ah, 02h  
mov dl, al    ;and then with the value
int 21h

这部分程序有2个问题。

  • 当您想要使用 AL 的结果时,它已被 DOS 系统调用销毁,留下值 AL="$"
  • 要将结果显示为字符,还需要加“0”。这将从 5 转换为“5”。

此解决方案解决了所有这些问题:

idiv bl
push ax         ;Save quotient in AL

lea dx, msg
mov ah, 09h
int 21h         ;This destroys AL !!!

pop dx          ;Get quotient back straight in DL
add dl, "0"     ;Make it a character
mov ah, 02h
int 21h