| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2728 人关注过本帖
标题:汇编新手想求教一下各位自己改的代码段
只看楼主 加入收藏
oped02
Rank: 2
等 级:论坛游民
帖 子:38
专家分:20
注 册:2022-10-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
汇编新手想求教一下各位自己改的代码段
TITLE SHOW ERR--Display DOS function call error messages
;Display a message based on an error code in AX
;All registers are preserved
;*****************************************************
DSEG    SEGMENT    PARA'DATA'
  CR    EQU    13
  LF    EQU    10
  EOM    EQU    '$'
  
  mess db    'which error did you get?','$'

monin    label    byte
  max    db    3    ;最多输入的字符数
  act    db    ?    ;在读入缓冲区时,此位置会自动存储输入数字的位数
  mon    db    3 dup(?);存储输入的数字,最多2个数字与一个回车
  
alfmon    db    '???',13,10,'$'

  char    db    '?'

OUT_OF_RANGE    DB 'Error code is not in vaild range(1-83)'
        DB CR,LF,EOM
RESERVED    DB 'Error code is reserved(36-79)',CR,LF,EOM
ER1        DB 'Invalid function number',CR,LF,EOM
ER2        DB 'File not found',CR,LF,EOM
ER3        DB 'Path not found',CR,LF,EOM
ER4        DB 'Too many open files',CR,LF,EOM
ER5        DB 'Access denied',CR,LF,EOM
ER6        DB 'Invalid handle',CR,LF,EOM
ER7        DB 'Memory control block destroyed',CR,LF,EOM
ER8        DB 'Insufficient memory',CR,LF,EOM
ER9        DB 'Invalid memory address',CR,LF,EOM
ER10        DB 'Invalid environment',CR,LF,EOM
ER11        DB 'Invalid format',CR,LF,EOM
ER12        DB 'Invalid access code',CR,LF,EOM
ER13        DB 'Invalid data',CR,LF,EOM
ER14        DB 'No such message',CR,LF,EOM
ER15        DB 'Invalid drive was specified' ,CR,LF,EOM
ER16        DB 'Attempted to remove the current directory',CR,LF,EOM
ER17        DB 'Not same device',CR,LF,EOM
ER18        DB 'No more files',CR,LF,EOM
ER19        DB 'Disk is write..protected',CR,LF,EOM
ER20        DB 'Unknown unit',CR,LF,EOM
ER21        DB 'Drive not ready',CR,LF,EOM
ER22        DB 'Unknown command',CR,LF,EOM
ER23        DB 'Data error (CRC)',CR,LF,EOM
ER24        DB 'Bad request structure length',CR,LF,EOM
ER25        DB 'Scek crror',CR,LF,EOM
ER26        DB 'Unknown media type',CR,LF,EOM
ER27        DB 'Sector not found',CR,LF,EOM
ER28        DB 'Printer out of paper',CR,LF,EOM
ER29        DB 'Write fault',CR,LF,EOM
ER30        DB 'Read fault',CR,LF,EOM
ER31        DB 'General failure',CR,LF,EOM
ER32        DB 'Sharing violation',CR,LF,EOM
ER33        DB 'Lock violation',CR,LF,EOM
ER34        DB 'Invalid disk change',CR,LF,EOM
ER35        DB 'FCB unavailable',CR,LF,EOM
ER80        DB 'File exists',CR,LF,EOM
ER81        DB 'Reserved',CR,LF,EOM
ER82        DB 'Cannot make',CR,LF,EOM
ER83        DB 'Fail on INT 24',CR,LF,EOM

ERTAB1          DW ER1,ER2,ER3,ER4,ER5,ER6,ER7,ER8,ER9,ER10
        DW ER11,ER12,ER13,ER14,ER15,ER16,ER17,ER18
        DW ER19,ER20,ER21,ER22,ER23,ER24,ER25,ER26
        DW ER27,ER28,ER29,ER30,ER31,ER32,ER33,ER34
        DW ER35
ERTAB2        DW ER80,ER81,ER82,ER83

DSEG        ENDS
;*****************************************************
CSEG        SEGMENT    PARA 'CODE'
        ASSUME CS:CSEG,DS:DSEG
SHOW_ERR PROC FAR
    PUSH    DS
    SUB    BX,BX
    PUSH    BX
;
    MOV    SI,DSEG        ;initialize DS
    MOV    DS,SI
;

    mov    dx,offset mess
    mov    ah,9
    int    21h
    mov    dl,13
    mov    ah,02
    int    21h    ;回车
    mov    dl,10
    mov    ah,02
    int    21h    ;换行

    lea    dx,monin
    mov    ah,0ah
    int    21h    ;键盘输入到缓冲区,(ds:dx+2)为输入字符串起始地址,注意此环境为小端地址

    mov    dl,13
    mov    ah,02
    int    21h   
   
    mov    dl,10
    mov    ah,02
    int    21h   
   
    cmp    act,0    ;若输入的字符数为0,cmp不保存结果直接影响符号位退出
    je    exit   

   
    cmp    act,2
    je    two

    mov    al,mon
    jmp    conv

two:
    mov    al,mon+1
    mov    ah,mon

conv:                ;将ASCII码转化为数字
    xor    ax,3030h    ;Clear ASCII 3's,使用异或将输入的ascii码转化为数字
   
    cmp    ah,0
    jnz    ten1
    jz    loc
   
ten1:
    cmp    ah,1
    jnz    ten2
    mov    ah,0
    add    al,10
    jmp    loc

ten2:
    cmp    ah,2
    jnz    ten3
    mov    ah,0
    add    al,20
    jmp    loc

ten3:
    cmp    ah,3
    jnz    ten4
    mov    ah,0
    add    al,30
    jmp    loc

ten4:
    cmp    ah,4
    jz    res
    JNZ    ten5

ten5:
    cmp    ah,5
    jz    res
    jnz    ten6

ten6:
    cmp    ah,6
    jz    res
    jnz    ten7

ten7:
    cmp    ah,7
    jz    res
    jnz    ten8
   

ten8:
    cmp    ah,8
    jnz    O_O_R
    mov    ah,0
    add    al,80
    jmp    loc
   
exit:    ret


loc:    CMP    AX,83        ;check for error code in range
    JG    O_O_R
    CMP    AX,0        
    JG    IN_RANGE
    mov    dl,13
    mov    ah,02
    int    21h        
    mov    dl,10
    mov    ah,02

res:    LEA    DX,RESERVED
    JMP    SHORT DISP_MSG   

O_O_R:    LEA    DX,OUT_OF_RANGE
    JMP    SHORT DISP_MSG
;ERROR CODE IS VALID,DETERMINE WITH TABLE TO USE


IN_RANGE:
    CMP    AX,35
    JG    TRY79
    LEA    BX,ERTAB1
    DEC    AX
    JMP    FORM_ADDR
TRY79:
    CMP    AX,79
    JG    LAST_4
    LEA    DX,RESERVED
    JMP    DISP_MSG
LAST_4:
    LEA    BX,ERTAB2
    AND    AX,3
FORM_ADDR:
    SHL    AX,1
    ADD    BX,AX
    MOV    DX,[BX]
DISP_MSG:
    MOV    AH,9
    INT    21H
    POP    AX
    RET

SHOW_ERR ENDP
;
CSEG    ENDS
;*****************************************************
    END    SHOW_ERR


就是我在DOS里直接从键盘输入字符,通过数字返回相应的错误码
错误码范围在:
1~35 80~83
不在这个范围内的也会返回相应的语句
35~79返回Error code is reserved(36-79)
84及以上返回Error code is not in vaild range(1-83)

我的代码只能适用于十位数以上的数字,如果是0~9会返回Error code is not in vaild range(1-83)

想请问一下各位是哪里出错了
搜索更多相关主题的帖子: MOV jmp Invalid code db 
2022-10-16 12:48
oped02
Rank: 2
等 级:论坛游民
帖 子:38
专家分:20
注 册:2022-10-16
收藏
得分:0 
纠结了很久,如果不是0~9出错,就是80~83出错
改了80~83的错误后,0~9就会出错
2022-10-16 12:49
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:0 
回复 2楼 oped02
回头看看
2022-10-17 18:29
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:20 
代码比较繁琐,所以没有追查当中错误,直接精简了一些
其实调整一下资料段,可以省下许多比较句子,写了解释,应该能看明白...

程序代码:
TITLE SHOW ERR--Display DOS function call error messages
;Display a message based on an error code in AX
;All registers are preserved
;*****************************************************
DSEG    SEGMENT  
  CR    EQU    13
  LF    EQU    10
  EOM    EQU    '$'
  mess db    'which error did you get?',CR,LF,'>$'

monin    label    byte
  max    db    3    ;最多输入的字符数
  act    db    ?    ;在读入缓冲区时,此位置会自动存储输入数字的位数
  mon    db    3 dup(?);存储输入的数字,最多2个数字与一个回车

ER0        DB 'Error code is reserved(36-79)'  ;保留字符
           DB CR,LF,EOM
ER1        DB 'Invalid function number',CR,LF,EOM
ER2        DB 'File not found',CR,LF,EOM
ER3        DB 'Path not found',CR,LF,EOM
ER4        DB 'Too many open files',CR,LF,EOM
ER5        DB 'Access denied',CR,LF,EOM
ER6        DB 'Invalid handle',CR,LF,EOM
ER7        DB 'Memory control block destroyed',CR,LF,EOM
ER8        DB 'Insufficient memory',CR,LF,EOM
ER9        DB 'Invalid memory address',CR,LF,EOM
ER10        DB 'Invalid environment',CR,LF,EOM
ER11        DB 'Invalid format',CR,LF,EOM
ER12        DB 'Invalid access code',CR,LF,EOM
ER13        DB 'Invalid data',CR,LF,EOM
ER14        DB 'No such message',CR,LF,EOM
ER15        DB 'Invalid drive was specified' ,CR,LF,EOM
ER16        DB 'Attempted to remove the current directory',CR,LF,EOM
ER17        DB 'Not same device',CR,LF,EOM
ER18        DB 'No more files',CR,LF,EOM
ER19        DB 'Disk is write..protected',CR,LF,EOM
ER20        DB 'Unknown unit',CR,LF,EOM
ER21        DB 'Drive not ready',CR,LF,EOM
ER22        DB 'Unknown command',CR,LF,EOM
ER23        DB 'Data error (CRC)',CR,LF,EOM
ER24        DB 'Bad request structure length',CR,LF,EOM
ER25        DB 'Scek crror',CR,LF,EOM
ER26        DB 'Unknown media type',CR,LF,EOM
ER27        DB 'Sector not found',CR,LF,EOM
ER28        DB 'Printer out of paper',CR,LF,EOM
ER29        DB 'Write fault',CR,LF,EOM
ER30        DB 'Read fault',CR,LF,EOM
ER31        DB 'General failure',CR,LF,EOM
ER32        DB 'Sharing violation',CR,LF,EOM
ER33        DB 'Lock violation',CR,LF,EOM
ER34        DB 'Invalid disk change',CR,LF,EOM
ER35        DB 'FCB unavailable',CR,LF,EOM
ER80        DB 'File exists',CR,LF,EOM
ER81        DB 'Reserved',CR,LF,EOM
ER82        DB 'Cannot make',CR,LF,EOM
ER83        DB 'Fail on INT 24',CR,LF,EOM
OUT_STR     DB 'Error code is not in vaild range(1-83)',CR,LF,EOM  ;越界字符

ERTAB1  DW ER1,ER2,ER3,ER4,ER5,ER6,ER7,ER8,ER9,ER10
        DW ER11,ER12,ER13,ER14,ER15,ER16,ER17,ER18
        DW ER19,ER20,ER21,ER22,ER23,ER24,ER25,ER26
        DW ER27,ER28,ER29,ER30,ER31,ER32,ER33,ER34
        DW ER35
RESERVED_CODE DW  (80-36) dup (ER0)  ;保留字符提示的范围
ERTAB2        DW ER80,ER81,ER82,ER83

DSEG        ENDS
;*****************************************************
CSEG        SEGMENT   
    ASSUME CS:CSEG,DS:DSEG
START:
    MOV    SI,DSEG        ;initialize DS
    MOV    DS,SI
;
    mov    dx,offset mess
    mov    ah,9
    int    21h

    lea    dx,monin
    mov    ah,0ah
    int    21h      ;键盘输入到缓冲区,(ds:dx+2)为输入字符串起始地址,注意此环境为小端地址
   
    cmp    act,1    ;比较1
    mov    ax,word ptr mon  ;取word
    sub    ax,3030h           ;减去'0',转为bcd,若输入'12',3132 -> 0102 (即bcd)
    xchg   ah,al
    jb     exit      ;若输入的字符数为0,cmp不保存结果直接影响符号位退出
    ja     two        ;若输入的字符>1,则跳
    mov    al,mon   ;取单字符
    mov    ah,'0'   ;十位字符取'0'
two:
    aad            ;将BCD码转化为数字,若bcd=12,aad后al=0Ch
    mov    dx,offset OUT_STR ;取错误字串
    cmp    ax,84    ;是否越界   
    jae    ERR      ;
    dec    ax       ;调整
    SHL    AX,1
    MOV    BX,AX
    MOV    DX,ERTAB1[BX];取字串地址
ERR:
    MOV    AH,9
    INT    21H
exit:
    MOV    AH,4CH
    INT    21H

CSEG    ENDS
;*****************************************************
END START
2022-10-17 19:38
oped02
Rank: 2
等 级:论坛游民
帖 子:38
专家分:20
注 册:2022-10-16
收藏
得分:0 
回复 4楼 Valenciax
感谢您的解答,代码精简,一读就懂,果然是大神
2022-10-17 19:40
oped02
Rank: 2
等 级:论坛游民
帖 子:38
专家分:20
注 册:2022-10-16
收藏
得分:0 
我也找到了我源代码段的错误,如果在缓冲区中如果只输入了个位数的话,那么就需要将ah中加入30H;
如果输入了个位数,假设只有al中的值有效而不管ah的话,3030H对ax异或会造成ah中出现不该出现的数字,从而使得本该为个位数的有效值增大
2022-10-17 19:44
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:0 
因为草草而写,刚才看了一下,原来我的代码里有点小bug,只输入个位数时会有错误,下面是修正并再精简一些

资料区完整规划所有规则,不须'任何比较'就得出结果,即'资料对应结果'
这是空间换取时间,也是空间换取'简约代码'的方法.

程序代码:
TITLE SHOW ERR--Display DOS function call error messages
;Display a message based on an error code in AX
;All registers are preserved
;*****************************************************
DSEG    SEGMENT  
  CR    EQU    13
  LF    EQU    10
  EOM    EQU    '$'
  mess db    'which error did you get?',CR,LF,'>$'

monin    label    byte
  max    db    3    ;最多输入的字符数
  act    db    ?    ;在读入缓冲区时,此位置会自动存储输入数字的位数
  mon    db    3 dup(?);存储输入的数字,最多2个数字与一个回车

ER0        DB 'Error code is reserved(36-79)'  ;保留字符
           DB CR,LF,EOM
ER1        DB 'Invalid function number',CR,LF,EOM
ER2        DB 'File not found',CR,LF,EOM
ER3        DB 'Path not found',CR,LF,EOM
ER4        DB 'Too many open files',CR,LF,EOM
ER5        DB 'Access denied',CR,LF,EOM
ER6        DB 'Invalid handle',CR,LF,EOM
ER7        DB 'Memory control block destroyed',CR,LF,EOM
ER8        DB 'Insufficient memory',CR,LF,EOM
ER9        DB 'Invalid memory address',CR,LF,EOM
ER10        DB 'Invalid environment',CR,LF,EOM
ER11        DB 'Invalid format',CR,LF,EOM
ER12        DB 'Invalid access code',CR,LF,EOM
ER13        DB 'Invalid data',CR,LF,EOM
ER14        DB 'No such message',CR,LF,EOM
ER15        DB 'Invalid drive was specified' ,CR,LF,EOM
ER16        DB 'Attempted to remove the current directory',CR,LF,EOM
ER17        DB 'Not same device',CR,LF,EOM
ER18        DB 'No more files',CR,LF,EOM
ER19        DB 'Disk is write..protected',CR,LF,EOM
ER20        DB 'Unknown unit',CR,LF,EOM
ER21        DB 'Drive not ready',CR,LF,EOM
ER22        DB 'Unknown command',CR,LF,EOM
ER23        DB 'Data error (CRC)',CR,LF,EOM
ER24        DB 'Bad request structure length',CR,LF,EOM
ER25        DB 'Scek crror',CR,LF,EOM
ER26        DB 'Unknown media type',CR,LF,EOM
ER27        DB 'Sector not found',CR,LF,EOM
ER28        DB 'Printer out of paper',CR,LF,EOM
ER29        DB 'Write fault',CR,LF,EOM
ER30        DB 'Read fault',CR,LF,EOM
ER31        DB 'General failure',CR,LF,EOM
ER32        DB 'Sharing violation',CR,LF,EOM
ER33        DB 'Lock violation',CR,LF,EOM
ER34        DB 'Invalid disk change',CR,LF,EOM
ER35        DB 'FCB unavailable',CR,LF,EOM
ER80        DB 'File exists',CR,LF,EOM
ER81        DB 'Reserved',CR,LF,EOM
ER82        DB 'Cannot make',CR,LF,EOM
ER83        DB 'Fail on INT 24',CR,LF,EOM
OUT_STR     DB 'Error code is not in vaild range(1-83)',CR,LF,EOM   ;越界字符

ERTAB1  DW ER1,ER2,ER3,ER4,ER5,ER6,ER7,ER8,ER9,ER10
        DW ER11,ER12,ER13,ER14,ER15,ER16,ER17,ER18
        DW ER19,ER20,ER21,ER22,ER23,ER24,ER25,ER26
        DW ER27,ER28,ER29,ER30,ER31,ER32,ER33,ER34
        DW ER35
RESERVED_CODE DW  (80-36) dup (ER0)               ;保留提示的范围
ERTAB2        DW ER80,ER81,ER82,ER83
          DW (100-84) dup (OUT_STR)           ;越界保留提示的范围 

DSEG        ENDS
;*****************************************************
CSEG        SEGMENT   
    ASSUME CS:CSEG,DS:DSEG
START:
    MOV    SI,DSEG        ;initialize DS
    MOV    DS,SI
;
    mov    dx,offset mess
    mov    ah,9
    int    21h

    lea    dx,monin
    mov    ah,0ah
    int    21h      ;键盘输入到缓冲区,(ds:dx+2)为输入字符串起始地址,注意此环境为小端地址
   
    cmp    act,1            ;比较1
    mov    ax,word ptr mon  ;取word,因低位在前, ah=低位,al=高位
    jb     exit             ;少于1则跳,若输入的字符数为0,cmp不保存结果直接影响符号位退出
    ja     two              ;大于1则跳
    mov    ah,'0'           ;至此,act=1,补十位字符'0', ah=高位,al=低位
    jmp    @f               ;跳到下一个'@@:' ,不交换
two:
    xchg   ah,al            ;高低位交换
@@: sub    ax,3030h         ;减去'0',转为bcd,若输入'12',3132 -> 0102 (即bcd)
    aad                     ;bcd调整,将bcd码转为数字,若bcd=0102,aad后al=0Ch
    dec    ax               ;减1,调整对齐
    SHL    AX,1
    MOV    BX,AX
    MOV    DX,ERTAB1[BX]    ;取字串地址
ERR:
    MOV    AH,9
    INT    21H
exit:
    MOV    AH,4CH   ;返回DOS
    INT    21H      ;调用DOS

CSEG    ENDS
;*****************************************************
END START



[此贴子已经被作者于2022-10-18 05:32编辑过]

2022-10-18 02:52
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:340
专家分:2482
注 册:2016-5-15
收藏
得分:0 
顺带一提,写的都是 8086 16bit汇编,若是 386汇编,上面的3句
SHL    AX,1
MOV    BX,AX
MOV    DX,ERTAB1[BX]  
可以一句包办
mov edx,ERTAB1[EAX*2]   ;因为指令必须是32bit暂存器,所以ax不可以,一定要eax和edx,但资料都在低位16bit,没影响结果
2022-10-18 05:49
oped02
Rank: 2
等 级:论坛游民
帖 子:38
专家分:20
注 册:2022-10-16
收藏
得分:0 
回复 8楼 Valenciax
感谢您的回答,又学到了新的知识。
2022-10-18 15:35
快速回复:汇编新手想求教一下各位自己改的代码段
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017707 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved