停课了,这是第二周,自己看着汇编


DSEG    SEGMENT
        STRING DB 'hello bird!',0DH,0AH,'$'
DSEG    ENDS

STACK1  SEGMENT   STACK
        DB 256 DUP(?)
STACK1  ENDS

CSEG    SEGMENT

        ASSUME  CS:CSEG, DS:DSEG, SS:STACK1

START:
        MOV AX,DSEG
        MOV DS,AX
        MOV BX,OFFSET STRING

        MOV AX,0
        MOV SI,AX
STR_L:  CMP STRING[SI],'a'
        JB NEXT
        CMP STRING[SI],'z'
        JA NEXT
        SUB STRING[SI],20H
NEXT:   INC SI
        CMP STRING[SI],'$'
        JNZ STR_L
       
        MOV DX,OFFSET STRING ;这句可以用LEA DX,NOTE来替代,DX是数据通用寄存器
        MOV AH,09H ;09H对应的是显示字符串
        INT 21H

        MOV     AX, 4C00H
        INT     21H

CSEG    ENDS

END START
 

 

循环的那段本来按书上这么写的

        MOV CX,11D
        MOV AX,0
        MOV SI,AX
STR_L:  CMP STRING[SI],'a'
        JB NEXT
        CMP STRING[SI],'z'
        JA NEXT
        SUB STRING[SI],20H
NEXT:   INC SI
        LOOP STR_L

 

然后貌似还可以这样

        MOV AX,0
        MOV SI,AX
STR_L:  .IF STRING[SI]>='a' && STRING[SI]<='z'
        SUB STRING[SI],20H
        .ENDIF
        INC SI
        CMP STRING[SI],'$'
        JNZ STR_L