📄 geti.asm
字号:
; GETI.ASM
;
; This module contains the integer input routine for the matrix
; example in Chapter Eight
.nolist
include stdlib.a
.list
include matrix.a
InpSeg segment para public 'input'
; Geti- On entry, es:di points at a string of characters.
; This routine skips any leading spaces and comma characters and then
; tests the first (non-space/comma) character to see if it is a digit.
; If not, this routine returns the carry flag set denoting an error.
; If the first character is a digit, then this routine calls the
; standard library routine "atoi2" to convert the value to an integer.
; It then ensures that the number ends with a space, comma, or zero
; byte.
;
; Returns carry clear and value in AX if no error.
; Returns carry set if an error occurs.
;
; This routine leaves ES:DI pointing at the character it fails on when
; converting the string to an integer. If the conversion occurs without
; an error, the ES:DI points at a space, comma, or zero terminating byte.
geti proc far
ifdef debug
print
char "Inside GETI",cr,lf,0
endif
; First, skip over any leading spaces or commas.
; Note the use of the "byp" symbol to save having to type "byte ptr".
; BYP is a text equate appearing in the macros.a file.
; A "byte ptr" coercion operator is required here because MASM cannot
; determine the size of the memory operand (byte, word, dword, etc)
; from the operands. I.e., "es:[di]" and ' ' could be any of these
; three sizes.
;
; Also note a cute little trick here; by decrementing di before entering
; the loop and then immediately incrementing di, we can increment di before
; testing the character in the body of the loop. This makes the loop
; slightly more efficient and a lot more elegant.
dec di
SkipSpcs: inc di
cmp byp es:[di], ' '
je SkipSpcs
cmp byp es:[di], ','
je SkipSpcs
; See if the first non-space/comma character is a decimal digit:
mov al, es:[di]
cmp al, '-' ;Minus sign is also legal in integers.
jne TryDigit
mov al, es:[di+1] ;Get next char, if "-"
TryDigit: isdigit
jne BadGeti ;Jump if not a digit.
; Okay, convert the characters that follow to an integer:
ConvertNum: atoi2 ;Leaves integer in AX
jc BadGeti ;Bomb if illegal conversion.
; Make sure this number ends with a reasonable character (space, comma,
; or a zero byte):
cmp byp es:[di], ' '
je GoodGeti
cmp byp es:[di], ','
je GoodGeti
cmp byp es:[di], 0
je GoodGeti
ifdef debug
print
char "GETI: Failed because number did not end with "
char "a space, comma, or zero byte",cr,lf,0
endif
BadGeti: stc ;Return an error condition.
ret
GoodGeti: clc ;Return no error and an integer in AX
ret
geti endp
InpSeg ends
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -