汇编编程语言:程序仅当输入为 ESC 时退出,并在退出前要求确认(y/n),否则循环

2024-04-28

我只是汇编语言编程的初学者。我们的第一个任务是让程序仅在输入为 ESC 时退出。退出之前请求确认 (y/n),否则循环。我知道 ESC 在 ASCII 代码中具有等效值,但我对插入位置或是否需要添加更多内容感到困惑。请帮我! 这是程序:

.model small
.stack 100h
.data
    msg1 db " <-- Non alpha!$"
msg2 db "Bye!$"

.code

start:
            ; display ?
mov dl, "?"         ; copy ? to dl
mov ah, 2h      ; display subprogram
int 21h         ; display ?

mov dl, " "         ; Provide space
mov ah, 2h      ; display subprogram
int 21h         

            ; read character from keyboard
mov ah, 1h      ; keyboard input subprogram
int 21h         ; read character into al 
            ; save character while we display a Return and Line-feed
    cmp al,65d      ; 'A'
    jb Non_alpha
    cmp al,90d      ; 'Z'
    ja above_alpha_upper

    mov bl, al              ; save character in bl
    add bl,32d      ; ADD 32 decimal
mov dl, bl      ; copy character to dl
mov ah, 2h      ; display subprogram
int 21h         ; display character in dl
    jmp x

Non_alpha:
    mov ax, @data
    mov ds,ax
    mov dx,offset msg1
    mov ah,9h
    int 21h
    jmp x           ; je,ja, jb

 above_alpha_upper:
cmp al,97d      ; 'a'
jb Non_alpha
cmp al,122d     ; 'z'
ja Non_alpha

mov bl, al              ; save character in bl
    sub bl,32d      ; SUBTRACT 32 decimal
mov dl, bl      ; copy character to dl
mov ah, 2h      ; display subprogram
int 21h         ; display character in dl

x:              ; exit
mov dl, 13d             ; dl = CR, Dh
    mov ah, 2h              ; display subprogram
    int 21h                 ; display CR
            ; display Line-feed
    mov dl, 10d             ; dl = LF , Ah
    mov ah, 2h              ; display subprogram
    int 21h                 ; display LF
            ; display character read from keyboard

mov ax, @data
    mov ds,ax
    mov dx, offset msg2 ; Bye
    mov ah,9h
    int 21h

mov ax, 4c00h       ; return to ms-dos
int 21h
end start

您可以简单地将其添加到“从键盘读取”之后

在.data中添加消息:

query_quit  db "Sure to quit? (y/n)$"

并将 DS 段 init 移到代码前面,就在开头

mov ax, @data       ; this should be set initially
mov ds,ax           ; not somewhere in middle of the code

通过 21h/01h 读取字符后,可以添加 ESC 检查

read_next:     
    mov ah, 1h      ; keyboard input subprogram     *
    int 21h         ; read character into al        *

    cmp al, 1bh     ; check for [ESC]
    jnz not_escape  ; skip asking if it wasnt

    mov dx, offset query_quit
    mov ah, 9
    int 21h         ; display query string

    mov ah,1
    int 21h        ; read keyboard again (for y/n)

    cmp ah,'y'     ; quit to dos if 'y' or 'Y' was pressed
    jz x
    cmp ah,'Y'
    jz x
    jmp read_next  ; or jmp start if you want the prompt again

not_escape:
    cmp al,65d      ; 'A'        ; *
    jb Non_alpha    ;              *
    ...      
  • =你之前的代码,显示我添加了一些
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

汇编编程语言:程序仅当输入为 ESC 时退出,并在退出前要求确认(y/n),否则循环 的相关文章

  • 在 REP MOVSW 之前 PUSH CS / POP DS 的目的是什么?

    为什么在下面的代码中我们压入代码段 PUSH CS 然后将其弹出到数据段 POP DS 我将这些行明确指定为 line1 和 line2 请告诉我 MOVSW 在这里是如何工作的 IF HIGHMEMORY PUSH DS MOV BX D
  • 汇编指令陷阱有什么作用?

    当程序需要时 程序通常会发出软件陷阱 由操作系统提供服务 通用异常处理程序 操作系统确定陷阱的原因并做出响应 适当地 汇编指令 trap 和 BASIC 中的 TRAP 指令一样吗 答案似乎是肯定的 你能接受还是拒绝我的结论 不中断 的代码
  • 预取双类成员需要转换为 char*?

    我有一个正在使用的课程 mm prefetch 预先请求包含 double 类型的类成员的缓存行 class MyClass double getDouble return dbl other members double dbl othe
  • 为 Visual Studio 应用程序设置平台目标的目的是什么?

    对于任何 VS 项目 都可以在该项目的构建属性中设置平台目标 您可以将其设置为任何 CPU x86 x64 或 Itanium 我的问题是 如果我将此值设置为 x86 是否意味着我无法在 x64 计算机上运行该项目 如果是这样 为什么还要使
  • Clang 使用 -nostdlib 生成崩溃代码

    我正在尝试为可执行文件设置自己的运行时环境 但无法使用 clang v3 4 1ubuntu1 目标 x86 64 pc linux gnu 来生成没有段错误的可执行文件 我已将问题简化为以下内容 如果我有一个文件 crt1 c 除了满足
  • orpd等SSE2指令有什么意义?

    The orpd指令是 压缩双精度浮点值的按位逻辑或 这不是做完 全相同的事情吗por 按位逻辑或 如果是这样 拥有它还有什么意义呢 请记住 SSE1orps https www felixcloutier com x86 orps首先 实
  • 在 x86 程序集中将整数打印到控制台

    当我在 16 位汇编中添加两个值时 将结果打印到控制台的最佳方法是什么 目前我有这个代码 CODE START mov ax 1 put 1 into ax add ax 2 add 2 to ax current value mov ah
  • CALL指令是否总是将EIP指向的地址压入堆栈?

    x86架构中函数调用时是否存在返回地址不入栈的情况 No CALL根据定义 将在跳转到目标地址之前将返回地址压入堆栈 该返回地址是EIP or RIP sizeof call instruction 通常为 5 个字节 英特尔 64 和 I
  • 为什么 Solaris 汇编器生成的机器代码与 GNU 汇编器在这里不同?

    我为 amd64 编写了这个小汇编文件 对于这个问题来说 代码的作用并不重要 globl fib fib mov edi ecx xor eax eax jrcxz 1f lea 1 rax ebx 0 add rbx rax xchg r
  • 减法进位标志

    我正在使用 MASM32 有了这个代码 mov eax 5 sub eax 10 CF 状态标志将被设置 但使用我的铅笔和纸 我实际上看到 MSB 没有任何进位 是的 我知道从较少的数字中减去大的数字集CF 但我想知道为什么 因为使用这段代
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • 用于预乘 ARGB 的 SSE alpha 混合

    我正在尝试编写一个支持 SSE 的 alpha 合成器 这就是我想出的 首先 混合两个 4 像素向量的代码 alpha blend two 128 bit 16 byte SSE vectors containing 4 pre multi
  • 为什么在强度降低乘法和循环进位加法之后,这段代码的执行速度会变慢?

    我正在读书阿格纳 雾 https en wikipedia org wiki Agner Fog s 优化手册 https en wikipedia org wiki Agner Fog Optimization 我遇到了这个例子 doub
  • 68HC11计算sin(x)的汇编代码

    68HC11 使用泰勒级数或查找表计算正弦值的汇编代码是什么 显示值只能是整数 查找表如何工作 在这种情况下 如何使用它来实现泰勒级数 http en wikipedia org wiki Taylor series 如果您正在寻找浮点解决
  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情
  • AVX-512CD(冲突检测)与原子变量访问有何不同?

    所以我在看他们展示了如何 void Histogram const float age int const hist const int n const float group width const int m const float o
  • 弹出 x86 堆栈以访问函数 arg 时出现分段错误

    我正在尝试链接 x86 程序集和 C 我的C程序 extern int plus 10 int include
  • 从 exe 文件中获取汇编级代码?

    我当时正在做linux汇编编程 在过去的几天里我已经转而学习windows汇编编程 我在用ml作为我的汇编器和golink作为我的链接器 我有我的汇编代码并已获得我的exe从中 现在我需要取回它的十六进制 xff xab x55等等 在li
  • 如何在 Debian 上编译 DOS 程序?

    在我的汇编语言课程中 我们使用 DPMI 编写 DOS 程序 不幸的是 我无法一直使用 32 位 Windows 机器 我在我使用的几乎每台计算机上都安装了 Debian 虚拟机 我已经安装了 DOSBox 和 DOSEMU 有什么办法可以
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi

随机推荐