无法计算 TASM 中字符串(数组)的长度。循环结束工作
Can't count string's (array's) length in TASM. Loop ends work
DATA SEGMENT
STRING DB "ABCDE", 0
DATA ENDS
SSEG SEGMENT STACK
DW 100 DUP(?)
SSEG ENDS
CODE SEGMENT
ASSUME CS:CODE, DS: DATA, SS:SSEG
START:
XOR AX, AX
MOV SI, OFFSET STRING ; SI ---> FIRST STRING MEMBER IN THIS SPECIFIC PROGRAMM.
; USED TO COUNT STRING'S LENGTH
DEC SI
;COUNTING STRING'S LENGTH
WHILE:INC SI
CMP STRING[SI], 0
JNZ WHILE
MOV AX, SI ;AX => 5H
EXIT:MOV AH, 4CH
INT 21H
CODE ENDS
END START
当 SI = 2 (STRING[SI] == STRING[2] == "C" == 43H) 时,循环结束他的工作。
当 SI = 2 时,ZF = 1。
为什么会这样?
(我在循环之前使用了DEC SI
,因为进入循环的第一条指令增加了 SI。就像 do-while 循环一样。如果它在 CMP 之后,它用于避免 INC 改变 ZF)。
ASSUME CS:CODE, DS: DATA, SS:SSEG
仅仅ASSUME
是不够的。对于 DS
段寄存器,您需要使用适当的代码来实现它。在程序启动时 DS
段寄存器不会自动指向您的 DATA SEGMENT
.
mov ax, @DATA
mov ds, ax
您的循环正在扫描程序的 PSP 并在第三个字节处停止,因为它恰好为零。 {CDh, 20h, 00h, A0h, ...}
另一个错误是您使用这些指令重复引用了字符串:
MOV SI, OFFSET STRING 1x
CMP STRING[SI], 0 2x
这个错误是
当您更正两个错误后,下一个代码将生成 SI=5
:
START:
mov ax, @DATA
mov ds, ax
mov si, -1
WHILE:
inc si
cmp STRING[si], 0
jne WHILE
; SI=5
DATA SEGMENT
STRING DB "ABCDE", 0
DATA ENDS
SSEG SEGMENT STACK
DW 100 DUP(?)
SSEG ENDS
CODE SEGMENT
ASSUME CS:CODE, DS: DATA, SS:SSEG
START:
XOR AX, AX
MOV SI, OFFSET STRING ; SI ---> FIRST STRING MEMBER IN THIS SPECIFIC PROGRAMM.
; USED TO COUNT STRING'S LENGTH
DEC SI
;COUNTING STRING'S LENGTH
WHILE:INC SI
CMP STRING[SI], 0
JNZ WHILE
MOV AX, SI ;AX => 5H
EXIT:MOV AH, 4CH
INT 21H
CODE ENDS
END START
当 SI = 2 (STRING[SI] == STRING[2] == "C" == 43H) 时,循环结束他的工作。 当 SI = 2 时,ZF = 1。 为什么会这样?
(我在循环之前使用了DEC SI
,因为进入循环的第一条指令增加了 SI。就像 do-while 循环一样。如果它在 CMP 之后,它用于避免 INC 改变 ZF)。
ASSUME CS:CODE, DS: DATA, SS:SSEG
仅仅ASSUME
是不够的。对于 DS
段寄存器,您需要使用适当的代码来实现它。在程序启动时 DS
段寄存器不会自动指向您的 DATA SEGMENT
.
mov ax, @DATA
mov ds, ax
您的循环正在扫描程序的 PSP 并在第三个字节处停止,因为它恰好为零。 {CDh, 20h, 00h, A0h, ...}
另一个错误是您使用这些指令重复引用了字符串:
MOV SI, OFFSET STRING 1x
CMP STRING[SI], 0 2x
这个错误是
当您更正两个错误后,下一个代码将生成 SI=5
:
START:
mov ax, @DATA
mov ds, ax
mov si, -1
WHILE:
inc si
cmp STRING[si], 0
jne WHILE
; SI=5