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 bx
将 dx: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
我编写了一个程序来计算 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 bx
将 dx: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