int 21h ah 02h 由于某种原因不起作用
int 21h ah 02h doesn't work for some reason
我的任务是从终端(aka atoi)读取一个数字,然后将其写回终端(aka itoa) .
要读取字符串,我使用 int 21h, ah 0ah
。当我在调试器中检查它时,它看起来不错。然后我的 atoi 和 itoa 看起来也不错,除了在 itoa 中我使用 int 21h, ah 02h
显示一个字符,但由于某种原因没有显示。所以我回到开头,注意到在 int 21h, ah 0ah
(读取字符串)之后写 int 21h, ah 02h
(打印字符)没有结果。
; STACK SEGMENT
STSEG SEGMENT PARA STACK "STACK"
DB 64 DUP (0)
STSEG ENDS
; DATA SEGMENT
DSEG SEGMENT PARA PUBLIC "DATA"
startStr db "Enter a number : $"
inputError db "Number has incorrect chars.", 10, "$"
buffError db "Number is too big", 10, "$"
bufferSize DB 16 ; 15 chars + RETURN
inputLength DB 0 ; number of read chars
buffer DB 16 DUP('?') ; actual buffer
DSEG ENDS
; CODE SEGMENT
CSEG SEGMENT PARA PUBLIC "CODE"
MAIN PROC FAR
ASSUME cs: CSEG, ds: DSEG, ss:STSEG
mov ax, DSEG
mov ds, ax
;lea dx, startStr
;call WRITING
;call READING
xor ax, ax
xor dx, dx
mov ah, 2
mov dl, 56
int 21h
;test display char before reading string - works fine
xor dx, dx
xor ax, ax
lea dx, bufferSize
mov ah, 10
int 21h
; reading string - works fine
xor ax, ax
xor dx, dx
mov ah, 2
mov dl, 56
int 21h
; trying to display char again - nothing
; call ATOI
; add ax, 15
; call ITOA
ret
MAIN ENDP
CSEG ENDS
END MAIN
Screenshoot
'8' 是我在开头显示的字符。 “123”是我输入的字符串,然后按回车键。
一旦DOS缓冲输入函数0Ah接收到enter键,
根据您的 DOS 模拟器的工作方式,光标会移动到当前行的开头还是移动到下一行。
由于输出第二个“8”是程序退出前唯一剩下的东西,DOS 提示符可能会覆盖第二个“8”。见 screenshot.
尝试推迟终止程序。就等钥匙了。
还要打印与您的第一个字符不同的内容。
mov dl, "*"
mov ah, 02h ; DOS.PrintChar
int 21h
mov ah, 00h ; BIOS.GetKey
int 16h
ret
MAIN ENDP
CSEG ENDS
END MAIN
我的任务是从终端(aka atoi)读取一个数字,然后将其写回终端(aka itoa) .
要读取字符串,我使用 int 21h, ah 0ah
。当我在调试器中检查它时,它看起来不错。然后我的 atoi 和 itoa 看起来也不错,除了在 itoa 中我使用 int 21h, ah 02h
显示一个字符,但由于某种原因没有显示。所以我回到开头,注意到在 int 21h, ah 0ah
(读取字符串)之后写 int 21h, ah 02h
(打印字符)没有结果。
; STACK SEGMENT
STSEG SEGMENT PARA STACK "STACK"
DB 64 DUP (0)
STSEG ENDS
; DATA SEGMENT
DSEG SEGMENT PARA PUBLIC "DATA"
startStr db "Enter a number : $"
inputError db "Number has incorrect chars.", 10, "$"
buffError db "Number is too big", 10, "$"
bufferSize DB 16 ; 15 chars + RETURN
inputLength DB 0 ; number of read chars
buffer DB 16 DUP('?') ; actual buffer
DSEG ENDS
; CODE SEGMENT
CSEG SEGMENT PARA PUBLIC "CODE"
MAIN PROC FAR
ASSUME cs: CSEG, ds: DSEG, ss:STSEG
mov ax, DSEG
mov ds, ax
;lea dx, startStr
;call WRITING
;call READING
xor ax, ax
xor dx, dx
mov ah, 2
mov dl, 56
int 21h
;test display char before reading string - works fine
xor dx, dx
xor ax, ax
lea dx, bufferSize
mov ah, 10
int 21h
; reading string - works fine
xor ax, ax
xor dx, dx
mov ah, 2
mov dl, 56
int 21h
; trying to display char again - nothing
; call ATOI
; add ax, 15
; call ITOA
ret
MAIN ENDP
CSEG ENDS
END MAIN
Screenshoot
'8' 是我在开头显示的字符。 “123”是我输入的字符串,然后按回车键。
一旦DOS缓冲输入函数0Ah接收到enter键, 根据您的 DOS 模拟器的工作方式,光标会移动到当前行的开头还是移动到下一行。
由于输出第二个“8”是程序退出前唯一剩下的东西,DOS 提示符可能会覆盖第二个“8”。见 screenshot.
尝试推迟终止程序。就等钥匙了。
还要打印与您的第一个字符不同的内容。
mov dl, "*"
mov ah, 02h ; DOS.PrintChar
int 21h
mov ah, 00h ; BIOS.GetKey
int 16h
ret
MAIN ENDP
CSEG ENDS
END MAIN