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

tianjigezhuhn 2012-11-09 11:36:49
TITLE	A10SELMU (EXE)
.386
.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.'
; ---------------------------------------------------------
.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



这段代码是从《IBM PC 汇编语言程序设计》第十章的例题,对照着抄下来的,用masm6.15编译可以通过,但是执行的时候会出现有非法指令这样的提示,无法执行
...全文
133 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianjigezhuhn 2012-11-10
  • 打赏
  • 举报
回复
把.386从.model上面移到.code上面就能够执行,但是执行结果并不如人意,很乱,和书上展示的不一样
tianjigezhuhn 2012-11-10
  • 打赏
  • 举报
回复
       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
tianjigezhuhn 2012-11-10
  • 打赏
  • 举报
回复
引用 1 楼 yh_no_code 的回复:
怎么不适用语法高亮 Assembly code123TITLE A10SELMU (EXE) .386 .MODEL SMALL .STACK 128; ------------------------------------------ .DATATOPROW EQU 08 ; 菜单上部的行BOTROW EQU 15 ; 菜单下……
不知道可以这样用
yh_no_code 2012-11-09
  • 打赏
  • 举报
回复
怎么不适用语法高亮


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

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧