首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

这段代码哪里有有关问题,求指教

2012-12-16 
这段代码哪里有问题,求指教TITLEA10SELMU (EXE).386.MODELSMALL.STACK128 -----------------------------

这段代码哪里有问题,求指教

TITLEA10SELMU (EXE)
.386
.MODELSMALL
.STACK128
; ------------------------------------------
.DATA
TOPROWEQU08; 菜单上部的行
BOTROWEQU15; 菜单下部的行
LEFCOLEQU26; 菜单左边的列
ATTRIBDB?; 屏幕的属性
ROWDB00; 屏幕的行
SHADOWDB19 DUP(0DBH); 阴影符
MENUDB0C9H, 17 DUP(0CDH), 0BBH
DB0BAH, ' Add recors', 0BAH
DB0BAH, ' Delete records  ', 0BAH
DB0BAH, ' Enter orders', 0BAH
DB0BAH, ' Print report', 0BAH
DB0BAH, ' Update accounts ', 0BAH
DB0BAH, ' View records', 0BAH
DB0C8H, 17 DUP(0CDH), 0BCH
PROMPTDB'To select an item, use <Up/Down Arrow>'
DB' and press <Enter>.'
DB13, 10, 'Press <Esc> to exit.'
; ---------------------
.CODE
A10MAINPROCFAR
MOVAX, @DATA; 初始化段寄存器
MOVDS, AX
MOVES, AX
CALLQ10CLEAR; 清屏
MOVROW, BOTROW+4; 设置行
A20:
CALLB10MENU; 显示菜单
MOVROW, TOPROW+1; 设置上部菜单项的行
MOVATTRIB, 16H; 设置反相显示
CALLD10DISPLY; 当前菜单行高度
CALLC10INPUT; 菜单选择
CMPAL, 1BH; 按下Escape键
JNEA20; 否,继续
MOVAX, 0600H; 是,结束
CALLQ10CLEAR; 清屏
MOVAX, 4C00H
INT21H; 处理结束
A10MAINENDP
; 显示阴影框、菜单以及提示符
; ---------------------
B10MENUPROCNEAR
PUSHA; 保存通用寄存器
MOVAX, 1301H; 请求显示阴影框
MOVBX, 0060H; 页和属性
LEABP, SHADOW; 阴影符
MOVCX, 19; 19个字符
MOVDH, TOPROW+1; 阴影上边的行
MOVDL, LEFCOL+1; 阴影左边的列
B20:INT10H
INCDH; 下一行

CMPDH, BOTROW+2; 显示完所有行?
JNEB20; 否,重复
MOVATTRIB, 71H; 白底蓝字
MOVAX, 1300H; 请求显示菜单
MOVBL, ATTRIB; 页和属性
MOVBH, 0
LEABP, MENU; 菜单行
MOVCX, 19; 行的长度
MOVDH, TOPROW; 行
MOVDL, LEFCOL; 列
B30:
INT10H
ADDBP, 19; 菜单下一行
INCDH; 下一行
CMPDH, BOTROW+1; 所有行显示完
JNEB30; 否,重复

MOVAX, 1301H; 请求显示字符
MOVBL, ATTRIB; 页和属性
MOVBH, 0
LEABP, PROMPT; 提字符的行
MOVCX, 79; 行的长度
MOVDH, BOTROW+4; 屏幕行
MOVDL, 00; 列
INT10H
POPA
RET
B10MENUENDP
; 接受键盘请求,箭头和回车用来选择菜单行
; ---------------------
C10INPUT PROCNEAR
PUSHA
C20:MOVAH, 10H; 从键盘请求一个
INT16H; 字符
CMPAH, 50H; 下箭头?
JEC30
CMPAH, 48H; 上箭头?
JEC40
CMPAL, 0DH; 回车键?
JEC90
CMPAL, 1BH; Escape键?
JEC90
JMPC20; 都不是重新输入
C30:MOVATTRIB, 71H; 白底蓝字
CALLD10DISPLY; 设置原来的行为正常显示
INCROW; 加1到下一行
CMPROW, BOTROW-1; 超过了底边的一行?
JBEC50; 否,继续
MOVROW, TOPROW+1; 是,重新设置
JMPC50
C40:MOVATTRIB, 71H; 白底蓝字
CALLD10DISPLY; 设置原来的行为正常显示
DECROW
CMPROW, TOPROW+1; 在上边行下面?
JAEC50; 否,继续
MOVROW, BOTROW-1; 是,重新设置

C50:MOVATTRIB, 17H; 蓝底白字
CALLD10DISPLY; 设置新行为反相显示


JMPC20
C90:POPA; 恢复寄存器
RET
C10INPUT ENDP
; 设置菜单行为高差度(如被选)
; 或正常差度(如为被选)
; --------------------------
D10DISPLY PROCNEAR
PUSHA; 保存通用寄存器
MOVAL, ROW; Row通知哪行要设置
MOVAH, 0
SUBAX, TOPROW
IMULAX, 19; 乘以行的长度
LEASI, MENU+1; 选择的菜单行
ADDSI, AX

MOVAX, 1300H; 请求显示
MOVBL, ATTRIB; 页和属性
MOVBH, 0
MOVBP, SI; 字符串
MOVCX, 17; 串长度
MOVDH, ROW; 行
MOVDL, LEFCOL+1; 列
INT10H
POPA
RET
D10DISPLY ENDP
; 清屏
; --------------------------
Q10CLEAR PROCNEAR
PUSHA
MOVAX, 0600H
MOVBH, 61H; 棕底蓝字
MOVCX, 0000H; 全屏
MOVDX, 184FH;
INT10H
POPA
RET
Q10CLEAR ENDP
ENDA10MAIN




这段代码是从《IBM PC 汇编语言程序设计》第十章的例题,对照着抄下来的,用masm6.15编译可以通过,但是执行的时候会出现有非法指令这样的提示,无法执行

[解决办法]
怎么不适用语法高亮


TITLE   A10SELMU (EXE)    .386    .MODEL  SMALL    .STACK  128; ------------------------------------------    .DATATOPROW  EQU 08  ; 菜单上部的行BOTROW  EQU 15  ; 菜单下部的行LEFCOL  EQU 26  ; 菜单左边的列ATTRIB  DB  ?   ; 屏幕的属性ROW DB  00  ; 屏幕的行SHADOW  DB  19 DUP(0DBH)   ; 阴影符MENU    DB  0C9H, 17 DUP(0CDH), 0BBH    DB  0BAH, ' Add recors   ', 0BAH    DB  0BAH, ' Delete records  ', 0BAH    DB  0BAH, ' Enter orders ', 0BAH    DB  0BAH, ' Print report ', 0BAH    DB  0BAH, ' Update accounts ', 0BAH    DB  0BAH, ' View records ', 0BAH    DB  0C8H, 17 DUP(0CDH), 0BCHPROMPT  DB  'To select an item, use <Up/Down Arrow>'    DB  ' and press <Enter>.'    DB  13, 10, 'Press <Esc> to exit.'; ---------------------    .CODEA10MAIN PROC    FAR    MOV AX, @DATA      ; 初始化段寄存器    MOV DS, AX    MOV ES, AX    CALL    Q10CLEAR        ; 清屏    MOV ROW, BOTROW+4      ; 设置行A20:        CALL    B10MENU         ; 显示菜单    MOV ROW, TOPROW+1      ; 设置上部菜单项的行    MOV ATTRIB, 16H        ; 设置反相显示    CALL    D10DISPLY       ; 当前菜单行高度    CALL    C10INPUT        ; 菜单选择    CMP AL, 1BH            ; 按下Escape键    JNE A20         ; 否,继续    MOV AX, 0600H      ; 是,结束    CALL    Q10CLEAR        ; 清屏    MOV AX, 4C00H    INT 21H         ; 处理结束A10MAIN ENDP; 显示阴影框、菜单以及提示符; ---------------------B10MENU PROC    NEAR    PUSHA               ; 保存通用寄存器    MOV AX, 1301H      ; 请求显示阴影框    MOV BX, 0060H      ; 页和属性    LEA BP, SHADOW     ; 阴影符    MOV CX, 19         ; 19个字符    MOV DH, TOPROW+1       ; 阴影上边的行    MOV DL, LEFCOL+1       ; 阴影左边的列B20:    INT 10H    INC DH          ; 下一行     CMP DH, BOTROW+2       ; 显示完所有行?    JNE B20         ; 否,重复    MOV ATTRIB, 71H        ; 白底蓝字    MOV AX, 1300H      ; 请求显示菜单    MOV BL, ATTRIB     ; 页和属性    MOV BH, 0    LEA BP, MENU       ; 菜单行    MOV CX, 19         ; 行的长度    MOV DH, TOPROW     ; 行    MOV DL, LEFCOL     ; 列B30:    INT 10H    ADD BP, 19         ; 菜单下一行    INC DH          ; 下一行    CMP DH, BOTROW+1       ; 所有行显示完    JNE B30         ; 否,重复     MOV AX, 1301H      ; 请求显示字符    MOV BL, ATTRIB     ; 页和属性    MOV BH, 0    LEA BP, PROMPT     ; 提字符的行    MOV CX, 79         ; 行的长度    MOV DH, BOTROW+4       ; 屏幕行    MOV DL, 00         ; 列    INT 10H    POPA    RETB10MENU ENDP; 接受键盘请求,箭头和回车用来选择菜单行; ---------------------C10INPUT PROC  NEAR    PUSHAC20:    MOV AH, 10H            ; 从键盘请求一个    INT 16H         ; 字符    CMP AH, 50H            ; 下箭头?    JE  C30    CMP AH, 48H            ; 上箭头?    JE  C40    CMP AL, 0DH            ; 回车键?    JE  C90    CMP AL, 1BH            ; Escape键?    JE  C90    JMP C20         ; 都不是重新输入C30:    MOV ATTRIB, 71H        ; 白底蓝字    CALL    D10DISPLY       ; 设置原来的行为正常显示    INC ROW         ; 加1到下一行    CMP ROW, BOTROW-1      ; 超过了底边的一行?    JBE C50         ; 否,继续    MOV ROW, TOPROW+1      ; 是,重新设置    JMP C50C40:    MOV ATTRIB, 71H        ; 白底蓝字    CALL    D10DISPLY       ; 设置原来的行为正常显示    DEC ROW    CMP ROW, TOPROW+1      ; 在上边行下面?    JAE C50         ; 否,继续    MOV ROW, BOTROW-1      ; 是,重新设置 C50:    MOV ATTRIB, 17H        ; 蓝底白字    CALL    D10DISPLY       ; 设置新行为反相显示    JMP C20C90:    POPA                ; 恢复寄存器    RETC10INPUT ENDP; 设置菜单行为高差度(如被选); 或正常差度(如为被选); --------------------------D10DISPLY PROC NEAR    PUSHA               ; 保存通用寄存器    MOV AL, ROW            ; Row通知哪行要设置    MOV AH, 0    SUB AX, TOPROW    IMUL    AX, 19         ; 乘以行的长度    LEA SI, MENU+1     ; 选择的菜单行    ADD SI, AX     MOV AX, 1300H      ; 请求显示    MOV BL, ATTRIB     ; 页和属性    MOV BH, 0    MOV BP, SI         ; 字符串    MOV CX, 17         ; 串长度    MOV DH, ROW            ; 行    MOV DL, LEFCOL+1       ; 列    INT 10H    POPA    RETD10DISPLY ENDP; 清屏; --------------------------Q10CLEAR PROC  NEAR    PUSHA    MOV AX, 0600H    MOV BH, 61H            ; 棕底蓝字    MOV CX, 0000H      ; 全屏    MOV DX, 184FH      ;    INT 10H    POPA    RETQ10CLEAR ENDP    END A10MAIN



[解决办法]
引用:
怎么不适用语法高亮
Assembly code123TITLE   A10SELMU (EXE)    .386    .MODEL  SMALL    .STACK  128; ------------------------------------------    .DATATOPROW  EQU 08  ; 菜单上部的行BOTROW  EQU 15  ; 菜单下……

不知道可以这样用
[解决办法]
       TITLE  A10SEL (EXE)
.MODEL        SMALL
.STACK        128
; ------------------------------------------
.DATA
      TOPROW  EQU       08          ; 菜单上部的行
      BOTROW  EQU       15          ; 菜单下部的行
      LEFCOL  EQU       26          ; 菜单左边的列
      ATTRIB  DB        ?           ; 屏幕的属性
         ROW  DB        00          ; 屏幕的行
      SHADOW  DB        19 DUP(0DBH)            ; 阴影符
        MENU  DB        0C9H, 17 DUP(0CDH), 0BBH
              DB        0BAH, ' Add recors', 0BAH
              DB        0BAH, ' Delete records  ', 0BAH
              DB        0BAH, ' Enter orders', 0BAH
              DB        0BAH, ' Print report', 0BAH
              DB        0BAH, ' Update accounts ', 0BAH
              DB        0BAH, ' View records', 0BAH
              DB        0C8H, 17 DUP(0CDH), 0BCH
      PROMPT  DB        'To select an item, use <Up/Down Arrow>'
              DB        ' and press <Enter>.'
              DB        13, 10, 'Press <Esc> to exit.'


; ---------------------
.386
.CODE
     A10MAIN  PROC      FAR
              MOV       AX, @DATA   ; 初始化段寄存器
              MOV       DS, AX
              MOV       ES, AX
              CALL      Q10CLEAR    ; 清屏
              MOV       ROW, BOTROW+4           ; 设置行
        A20:
              CALL      B10MENU     ; 显示菜单
              MOV       ROW, TOPROW+1           ; 设置上部菜单项的行
              MOV       ATTRIB, 16H ; 设置反相显示
              CALL      D10DISPLY   ; 当前菜单行高度
              CALL      C10INPUT    ; 菜单选择
              CMP       AL, 1BH     ; 按下Escape键
              JNE       A20         ; 否,继续
              MOV       AX, 0600H   ; 是,结束
              CALL      Q10CLEAR    ; 清屏
              MOV       AX, 4C00H
              INT       21H         ; 处理结束
     A10MAIN  ENDP
; 显示阴影框、菜单以及提示符
; ---------------------
     B10MENU  PROC      NEAR
              PUSHA                 ; 保存通用寄存器
              MOV       AX, 1301H   ; 请求显示阴影框
              MOV       BX, 0060H   ; 页和属性
              LEA       BP, SHADOW  ; 阴影符


              MOV       CX, 19      ; 19个字符
              MOV       DH, TOPROW+1            ; 阴影上边的行
              MOV       DL, LEFCOL+1            ; 阴影左边的列
        B20:  INT       10H
              INC       DH          ; 下一行

              CMP       DH, BOTROW+2            ; 显示完所有行?
              JNE       B20         ; 否,重复
              MOV       ATTRIB, 71H ; 白底蓝字
              MOV       AX, 1300H   ; 请求显示菜单
              MOV       BL, ATTRIB  ; 页和属性
              MOV       BH, 0
              LEA       BP, MENU    ; 菜单行
              MOV       CX, 19      ; 行的长度
              MOV       DH, TOPROW  ; 行
              MOV       DL, LEFCOL  ; 列
        B30:
              INT       10H
              ADD       BP, 19      ; 菜单下一行
              INC       DH          ; 下一行
              CMP       DH, BOTROW+1            ; 所有行显示完
              JNE       B30         ; 否,重复

              MOV       AX, 1301H   ; 请求显示字符
              MOV       BL, ATTRIB  ; 页和属性


              MOV       BH, 0
              LEA       BP, PROMPT  ; 提字符的行
              MOV       CX, 79      ; 行的长度
              MOV       DH, BOTROW+4            ; 屏幕行
              MOV       DL, 00      ; 列
              INT       10H
              POPA
              RET
     B10MENU  ENDP
; 接受键盘请求,箭头和回车用来选择菜单行
; ---------------------
    C10INPUT  PROC      NEAR
              PUSHA
        C20:  MOV       AH, 10H     ; 从键盘请求一个
              INT       16H         ; 字符
              CMP       AH, 50H     ; 下箭头?
              JE        C30
              CMP       AH, 48H     ; 上箭头?
              JE        C40
              CMP       AL, 0DH     ; 回车键?
              JE        C90
              CMP       AL, 1BH     ; Escape键?
              JE        C90
              JMP       C20         ; 都不是重新输入
        C30:  MOV       ATTRIB, 71H ; 白底蓝字
              CALL      D10DISPLY   ; 设置原来的行为正常显示
              INC       ROW         ; 加1到下一行
              CMP       ROW, BOTROW-1           ; 超过了底边的一行?


              JBE       C50         ; 否,继续
              MOV       ROW, TOPROW+1           ; 是,重新设置
              JMP       C50
        C40:  MOV       ATTRIB, 71H ; 白底蓝字
              CALL      D10DISPLY   ; 设置原来的行为正常显示
              DEC       ROW
              CMP       ROW, TOPROW+1           ; 在上边行下面?
              JAE       C50         ; 否,继续
              MOV       ROW, BOTROW-1           ; 是,重新设置

        C50:  MOV       ATTRIB, 17H ; 蓝底白字
              CALL      D10DISPLY   ; 设置新行为反相显示
              JMP       C20
        C90:  POPA                  ; 恢复寄存器
              RET
    C10INPUT  ENDP
; 设置菜单行为高差度(如被选)
; 或正常差度(如为被选)
; --------------------------
   D10DISPLY  PROC      NEAR
              PUSHA                 ; 保存通用寄存器
              MOV       AL, ROW     ; Row通知哪行要设置
              MOV       AH, 0
              SUB       AX, TOPROW
              IMUL      AX, 19      ; 乘以行的长度
              LEA       SI, MENU+1  ; 选择的菜单行
              ADD       SI, AX

              MOV       AX, 1300H   ; 请求显示


              MOV       BL, ATTRIB  ; 页和属性
              MOV       BH, 0
              MOV       BP, SI      ; 字符串
              MOV       CX, 17      ; 串长度
              MOV       DH, ROW     ; 行
              MOV       DL, LEFCOL+1            ; 列
              INT       10H
              POPA
              RET
   D10DISPLY  ENDP
; 清屏
; --------------------------
    Q10CLEAR  PROC      NEAR
              PUSHA
              MOV       AX, 0600H
              MOV       BH, 61H     ; 棕底蓝字
              MOV       CX, 0000H   ; 全屏
              MOV       DX, 184FH   ;
              INT       10H
              POPA
              RET
    Q10CLEAR  ENDP
              END       A10MAIN


[解决办法]
把.386从.model上面移到.code上面就能够执行,但是执行结果并不如人意,很乱,和书上展示的不一样

热点排行