无法计算 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