绅士羊 2024-06-22 10:04 采纳率: 78.6%
浏览 4

在dos环境用汇编语言写一个简易菜单,用上下键选择选项,同时打入回车键响应相应功能,但是在这一步卡了,就是打入回车时第一行功能并不使用

自学过程中,打算在dos环境用汇编语言写一个简易菜单,用上下键选择选项,同时打入回车键响应相应功能,但是在这一步卡了,就是打入回车时第一行功能并不使用,只能进行选项的选择,功能不能实现
以下是.asm文件

;extrn jiamain:far
;include cluate.mac
openwindow macro
mov ah,6
mov al,0
mov bh,70h
mov ch,5
mov cl,10
mov dl,59
int 10h
endm


OPTION_TOP equ 11  ;顶部选项(行)
OPTION_BOTTOM equ 14 ;底部选项(行)

data segment
;主菜单界面
mainOption1 DB 'ADD', 0DH, 0AH, '$'  ;7 B
mainOption2 DB 'SUB', 0DH, 0AH, '$'
mainOption3 DB 'MUL', 0DH, 0AH, '$'
mainOption4 DB 'DIV', 0DH, 0AH, '$'
currentRow DB OPTION_TOP ;初始化当前行
data ends

mainCode segment
assume cs:mainCode,ds:data
main:
    mov ax, 01H ;设置文本显示方式01H
    int 10H
    mov ah, 1   ;置光标类型
    mov cx, 1000H  ;隐藏光标
    int 10H
    
    mov ax, data
    mov es, ax
    mov ax, 1300H ;显示字符串,方式0

mainMenu macro head, pageColour, len, showpos
    mov bp, offset head ;显示标题
    mov bx, pageColour ;显示页和颜色
    mov cx, len  ;字符串长度
    mov dx, showpos ;显示行列位置
    int 10H
endm

;显示选项1
mainMenu mainOption1, 7H, 7, 0B10H
;显示选项2
mainMenu mainOption2, 7H, 7, 0C10H
;显示选项3
mainMenu mainOption3, 7H, 7, 0D10H
mainMenu mainOption4, 7H, 7, 0E10H

call indicateRow  ;切换行属性    
userSelect:
    mov ah, 0
    int 16H
    cmp ah, 1CH  ;enter键
    je confirm
    cmp ah, 48H  ;上方向键
    je moveUp
    cmp ah, 50H  ;下方向键
    je moveDn
    jmp short userSelect
 call_jia:
     openwindow
     call jiamain
confirm:
     cmp currentRow,OPTION_TOP
     jz call_jia      
moveUp:
    call moveUpward
    jmp short userSelect

moveDn:
    call moveDown
    jmp short userSelect

return:
    mov ax, 4C00H
    int 21H

;当前指示行,倒置切换行属性,切换两次即还原
indicateRow proc
    push ax
    push bx
    push cx
    push ds
    push es
    ;参数:currentRow
    mov ax, 0B800H
    mov es, ax
    mov ax, data
    mov ds, ax
    mov al, currentRow
    mov bl, 80
    mul bl
    mov bx, ax
    mov ah, 01111111B
    mov cx, 40
indicate:
    xor es:[bx + 1], ah
    add bx, 2
    loop indicate
    ;返回:无
    pop es
    pop ds
    pop cx
    pop bx
    pop ax
    ret
indicateRow endp

;向上选择
moveUpward proc
    call indicateRow  ;首先恢复原行
    push ax
    push ds
    ;参数:currentRow
    mov ax, data
    mov ds, ax
    cmp currentRow, OPTION_TOP
    je optionTop  ;是顶部选项则转移
    dec currentRow  ;上移则减行
    jmp short mUpNext
optionTop:
    mov currentRow, OPTION_BOTTOM ;由顶部转到底部
mUpNext:
    call indicateRow
    pop ds
    pop ax
    ret
moveUpward endp

;向下选择
moveDown proc
    call indicateRow  ;首先恢复原行
    push ax
    push ds
    ;参数:currentRow
    mov ax, data
    mov ds, ax
    cmp currentRow, OPTION_BOTTOM
    je optionBot  ;是底部选项则转移
    inc currentRow  ;下移则增行
    jmp short mDnNext
optionBot:
    mov currentRow, OPTION_TOP ;由底部转到顶部
mDnNext:
    call indicateRow
    pop ds
    pop ax
    ret
moveDown endp

mainCode ends
end main


运行截图:

img

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-06-22 10:04
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    从你提供的代码和描述来看,问题出在回车键响应的处理上。在userSelect标签下的代码中,你检查了回车键的扫描码(1CH),但并没有正确地调用相应的功能函数。你的代码中有一个call_jia标签,但这个标签并没有被正确地调用。

    以下是你需要进行的修改:

    1. 确保confirm标签下的代码能够正确地根据currentRow的值调用相应的功能函数。你需要为每个选项定义一个调用标签。

    2. confirm标签下,使用jmpcall指令跳转到相应的功能实现代码。

    3. 你需要定义每个选项对应的功能函数,例如call_jia,然后在confirm标签下根据currentRow的值调用这些函数。

    以下是修改后的confirm部分的示例代码:

    confirm:
        cmp currentRow, OPTION_TOP
        je call_jia
        ; 这里添加其他选项的比较和调用
        ; je call_sub
        ; je call_mul
        ; je call_div
        jmp userSelect ; 如果不是有效的选项,则重新等待用户输入
    
    call_jia:
        ; 调用加法功能的代码
        ; 这里应该是调用jiamain函数的代码
        ; 例如: call jiamain
        jmp userSelect ; 处理完功能后,返回到用户选择界面
    

    请注意,你需要根据实际的功能实现来填充call_jia(以及其他可能的功能函数)的实现细节。

    另外,从你提供的运行截图来看,我无法直接分析截图内容,因为我不能查看图像文件。但是,根据你的描述,如果第一行的功能选项不响应,可能是因为confirm标签下没有正确地调用call_jia或其他功能函数。

    最后,确保你的程序中所有功能函数都已经被正确定义,并且在confirm标签下根据用户的选择调用了正确的函数。

    希望这些修改能够帮助你解决问题。如果还有其他问题或需要进一步的帮助,请随时告诉我。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月22日

悬赏问题

  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取
  • ¥15 sqlserver执行存储过程报错
  • ¥100 nuxt、uniapp、ruoyi-vue 相关发布问题
  • ¥15 浮窗和全屏应用同时存在,全屏应用输入法无法弹出
  • ¥100 matlab2009 32位一直初始化
  • ¥15 Expected type 'str | PathLike[str]…… bytes' instead
  • ¥15 为什么在iis上部署网站,服务器可以访问,但是本地电脑访问不了
  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数
  • ¥15 ADS时域 连续相位观察方法