标签:access offset jmp 设计 line 数据段 dup color 假设
???????????
DATA    SEGMENT
    WELCOME DB  "Please input your string: ",'$'
    
    STR DB  12
        DB  ?   
        DB  12  DUP(0)
DATA    ENDS
CODE    SEGMENT
    ASSUME  DS:DATA,CS:CODE
START:
    MOV AX,DATA
    MOV DS,AX
    LEA SI,WELCOME
    MOV DX,SI
    MOV AH,09H
    INT 21H     ;输出welcome字符
    MOV DL,0DH      ;输出的时候,输出dl的内容
    MOV AH,02H      ;输出回车
    INT 21H
    MOV DL,0AH      ;0ah是换行
    MOV AH,02H      ;输出换行
    INT 21H
    LEA DX,STR
    MOV AH,0AH
    INT 21H     ;输入数据,str字符串
    MOV AL,STR+1        ;字符串个数
    MOV CX,AL
    
    ADD AL,2
    MOV AH,0
    MOV SI,AX
    MOV STR[SI],'$' ;把$送到字符串末尾
    LEA SI,STR
    MOV AL,'&'      ; 把判断&放到al中
    JMP BEGIN
CHANGE: MOV [SI],' '
BEGIN:  CMP AL,[SI]     ;使用cmp判断
    JZ  CHANGE      ;判断零位,跳转change
    
    LOOP    BEGIN
    
    LEA DX,STR
    MOV AH,09H
    INT 21H
    MOV AH,4CH
    INT 21H 
    
CODE    ENDS
    END START使用了循环,指针定位。判断方法是一个个字符比较判断。
DATA    SEGMENT
    STR1    DB  512 DUP('$')
    LEN EQU $-STR1
    STR2    DB  512 DUP('$')
    TRUE    DB  'YES$'
    FALSE   DB  'NO$'
DATA    ENDS
CODE    SEGMENT
    ASSUME  DS:DATA,CS:CODE
START:
    MOV AX,DATA
    MOV DS,AX
    MOV ES,AX           ;设置附加段
    ;MOV    CX,LEN          ;设置循环位
    
    MOV DI,OFFSET   STR1    ;DI保存str1的偏移地址
    MOV SI,OFFSET   STR2    ;SI保存str2的偏移地址
    
    MOV DX,OFFSET   STR1
    MOV AH,0AH          ;输入str1
    INT 21H
    
    MOV DL,0DH          ;回车换行
    MOV AH,02H
    INT 21H 
    MOV DL,0AH
    MOV AH,02H
    INT 21H
    MOV DX,OFFSET   STR2    ;输入第二个字符
    MOV AH,0AH  
    INT 21H
    MOV DL,0DH          ;回车换行
    MOV AH,02H
    INT 21H 
    MOV DL,0AH
    MOV AH,02H
    INT 21H
    CLD
    
    MOV CX,LEN
    REPZ    CMPSB           ;进行串操作比较
    JZ  MATCH           ;比较置零位,为0
    JNZ NOMATCH     ;为1
MATCH:  MOV AH,09H
    MOV DX,OFFSET   TRUE    ;如果匹对
    INT 21H
    JMP DONE
NOMATCH:    MOV AH,09H      ;如果不匹对
    MOV DX,OFFSET   FALSE
    INT 21H
    JMP DONE
DONE:   MOV AH,4CH          ;返回操作系统
    INT 21H
CODE    ENDS
    END START该程序,用了字符串判断操作 REPZ CMPSB 该指令比较的是ds:si和es:di所指向的两个字节如果相等,那么继续进行,不相等,推出,标志位1。然后通过判断标志位,判断该字符串是否相等
- CMPSB 是字节串比较
- CMPSW 字串比较
- 将源变址寄存器指向数据段中的一 字节( 或字,或双字)减去目的变址寄存器指向附加段中的一字节( 或 字,或 双 字),不保留相减结果, 但设置标志位:OF、SF、ZF、AF、PF 和 CF。每比较 一次, 根据方向标志 DF 及数据类型对源变址寄存器和目的变址寄存器进行修改。【徐洁. 计算机组成原理与汇编语言程序设计(第4版)】
| 操作 | 过程 | 操作方向 | 
|---|---|---|
| 字节操作( CMPSB ) | SI/ ESI ?( SI/ ESI) ± 1; DI/ EDI ?( DI/ EDI) ± 1 | ( DS:( SI/ ESI )) ? ( ES: ( DI/ EDI )) | 
| 字操作 ( CMPSW ) | SI/ ESI ?( SI/ ESI) ± 2; DI/ EDI ?( DI/ EDI) ± 2 | 同上 | 
标签:access offset jmp 设计 line 数据段 dup color 假设
原文地址:https://www.cnblogs.com/Yunrui-blogs/p/11593859.html