zoukankan      html  css  js  c++  java
  • 比较分别在数据段与附加段中的字符串以及汇编中常见的四种中断指令

    1.从键盘输入两个相同长度的字符串,分别放到数据段和附加段,利用串比较指令比较数据段和附加段中两个字符串,如果两串一样,输出Y,否则输出N。

    这个程序调试了好久,之间遇到两个问题,其一是附加段的使用,需要对DS压栈对ES调整处理,即

    1 PUSH    DS
    2 MOV     AX,ES        
    3 MOV     DS,AX
    4 ;......
    5 POP      DS    
    View Code

    其二是,串比较指令CMPSW进行字比较,而CMPSB进行字节比较,需要区分开。(其实我现在还不明白即便是字符组成的串,进行字比较为什么会出错,有高手知道吗?)

    下面是程序:

     1 DATA    SEGMENT
     2 VA DB 50,0,50 DUP(0),'$'
     3 V1 DB 'Y'
     4 V2 DB 'N'
     5 ENTER DB 0AH, 0DH, '$'
     6 DATA    ENDS
     7 DATA2    SEGMENT
     8 VB DB 50,0,50 DUP(0),'$'
     9 DATA2    ENDS
    10 CODE    SEGMENT
    11     ASSUME CS:CODE,DS:DATA,ES:DATA2
    12 START:  MOV    AX,DATA        ;装入DS
    13     MOV    DS,AX
    14     MOV    AX,DATA2    ;装入ES
    15     MOV    ES,AX
    16     
    17     MOV    DX,OFFSET VA    ;输入字符串VA
    18     MOV     AH,0AH
    19     INT    21H    
    20     
    21     PUSH    DX        ;回车换行
    22     MOV     DX, OFFSET ENTER
    23     MOV     AH, 09H
    24     INT     21H
    25     POP    DX
    26 
    27     PUSH    DS
    28     MOV    AX,ES        ;对附加段的处理
    29     MOV    DS,AX
    30     MOV    DX,OFFSET VB    ;输入字符串VB
    31     MOV    AH,0AH
    32     INT    21H
    33     POP    DS
    34 
    35     PUSH    DX        ;回车换行
    36     MOV     DX, OFFSET ENTER
    37     MOV     AH, 09H
    38     INT     21H
    39     POP    DX
    40     
    41     LEA    SI,VA        ;把源串地址传给SI
    42  ;  PUSH    DS
    43   ; MOV    AX,ES
    44   ; MOV    DS,AX
    45     LEA    DI,VB        ;把目的串地址传给DI
    46   ; POP    DS
    47     
    48     CLD            ;清除方向标志,使向前
    49     MOV    CX,50        ;重复计数器
    50     REPE    CMPSB        ;相等则重复,CX为0或者遇到不相等则顺序执行
    51     JE    J1        ;相等则跳转
    52     MOV    AH,2
    53     MOV    DL,V2
    54     INT    21H
    55     JMP    J2
    56 J1:    MOV    AH,2
    57     MOV    DL,V1
    58     INT    21H
    59 J2:    MOV    AH,4CH        
    60     INT    21H
    61 CODE    ENDS
    62     END  START
    View Code
    截图:

    2.下面顺便提一下常见的四种中断:

    1)键盘输入字符中断

    Mov ah,1

    Int  21h;结果是 al←输入字符的ASCII码

    2)屏幕显示一个字符中断

    Mov ah,2

    Mov dl,要显示字符的ASCII码

    Int  21h;(注意:这里al会变为要输出的字符的ASCII码)

    3)屏幕显示字符串(9号功能调用)

    格式:   MOV DX, 字符串的偏移地址
         MOV AH, 09H
         INT 21H

    在使用9号功能调用时,应当注意以下问题:

        ① 待显示的字符串必须先放在内存一数据区(DS段)中,且以‘$’符号作为结束标志。

        ② 应当将字符串首地址的段基址和偏移地址分别存入DS和DX寄存器中。

    4)键盘输入字符串(0AH号功能调用)

           格式:   MOV DX, 已定义缓冲区的偏移地址
                MOV AH, 0AH
                 INT 21H

    ① 执行前先定义一个输入缓冲区,缓冲区内第一个字节定义为允许最多输入的字符个数,该个数包括回车符0DH在内。第二个字节保留,在执行程序完毕后存入输入的实际字符个数(不含回车)。从第三个字节开始存入从键盘上接收字符的ASCII码。若实际输入的字符个数少于定义的最大字符个数,则缓冲区其他单元自动清0。若实际输入的字符个数大于定义的字符个数,其后输入的字符丢弃不用,一直到输入回车键为止。

    ② 应当将缓冲区首地址的段基址和偏移地址分别存入DS和DX寄存器中。

    举例:

  • 相关阅读:
    LeetCode OJ
    LeetCode OJ
    LeetCode OJ
    LeetCode OJ
    LeetCode OJ
    LeetCode OJ
    LeetCode OJ
    LeetCode OJ
    LeetCode OJ
    LeetCode OJ
  • 原文地址:https://www.cnblogs.com/jiu0821/p/4158869.html
Copyright © 2011-2022 走看看