回 帖 发 新 帖 刷新版面

主题:【求助】中断程序设计——密码转换

要求按照0~9分别对应7846302951的规则,输出密码字符串。
要用dos的01和09功能调用。
先来献丑
DSEG SEGMENT
L1 DB 21 DUP('$')
L2 DB '7846302951'
DSEG ENDS
CSEG SEGMENT
    ASSUME CS:CSEG,DS:DSEG
MAIN PROC FAR
    PUSH DS
    MOV AX,0
    PUSH AX
    CLI
    MOV AX,SEG NEWINT65
    MOV DS,AX
    MOV DX,OFFSET NEWINT65
    MOV AL,65H
    MOV AH,25
    INT 21H
    STI
    MOV AX,DSEG
    MOV DS,AX
    INT 65H
    RET
MAIN ENDP

NEWINT65 PROC FAR
    PUSH DX
    PUSH CX
    PUSH BX
    PUSH AX
    PUSH SI
    MOV CL,OFFSET L2
    MOV DL,OFFSET L1
    MOV SI,0
LOOP1:MOV AH,01
    INT 21H
    CMP AL,0AH
    JZ ED
    SUB AL,30H
    MOV BL,[CL+AL];这里有错误
    MOV L1[SI],BL
    INC SI
    JMP LOOP1
ED:    MOV DX,OFFSET L1
    MOV AH,09H
    INT 21H
    POP SI
    POP AX
    POP BX
    POP CX
    POP DX
    IRET
NEWINT65 ENDP
    CSEG ENDS
END MAIN

回复列表 (共4个回复)

沙发

实现你那要的功能,不需要搞那么复杂
下面是我写的,看如何?
DSEG SEGMENT
L1 DB 21 DUP('$')
L2 DB '7846302951'
DSEG ENDS
CSEG SEGMENT
    ASSUME CS:CSEG,DS:DSEG
MAIN PROC FAR
     MOV AX,SEG DSEG
     MOV DS,AX
     MOV CL,LENGTH L1
     MOV SI,OFFSET L1
P1:
     MOV AH,01H        ;键入并显示
     INT 21H
     CMP AL,0DH        ;键入回车显示转好的密码
     JZ ED
     CMP AL,30H        ;小于0重键入
     JL P1
     CMP AL,39H        ;大于9重键入
     JL P1
     SUB AL,30H        ;转为数
     MOV AH,0H
     MOV DX,OFFSET L2  ;密匙地址
     ADD AX,DX
     MOV DX,AX
     MOV AL,[DX]       
     MOV [SI],AL       ;密码存入L1
     INC SI
     LOOP P1
ED:
     MOV DX,OFFSET L1  ;显示密码
     MOV AH,09H
     INT 21H
     ....              ;其他
MAIN ENDP
      
CSEG ENDS

板凳


谢谢了,刚刚学好多地方没搞懂……不过似乎我的意思是设计中断程序。

3 楼

楼主的程序中,因为用于间接寻址的只能是BX,BP,SI,DI四个寄存器,地址的二十位的,要用十六位分别对段地址和偏移地址运算,用CL,AL是不行的

4 楼


那么要怎么改程序才正确呢??

我来回复

您尚未登录,请登录后再回复。点此登录或注册