assembly - 汇编 x86 程序。计算输入中的数字
问题描述
你好我只是学习组装,所以我还不太了解很多东西。
我必须编写一个程序,其中用户输入某种行的各种字母数字等。程序应该计算输入中有多少数字并打印出计数器。
这是我的代码:
.model small
.stack 100h
.data
buffer db 100, ?, 100 dup (0)
count db 0
.code
start:
mov ax, @data
mov ds, ax
mov dx, offset buffer
mov ah, 0Ah
int 21h
mov ah, buffer
xor si, si
xor cx, cx
.loop:
.notdigit:
mov dl, buffer[si]
inc Si
cmp dl, 0
jz .end
cmp dl, '0'
jb .notdigit
cmp dl, '9'
ja .notdigit
inc count
jmp .loop
.end:
; count contains the digit count
mov dl, count
mov ah, 2h
int 21h
我没有收到任何错误,但是当我运行它时程序并没有真正工作。
这里有什么问题?我应该如何改变它?
解决方案
输入
buffer db 100, ?, 100 dup (0)
这是 DOS 函数 0Ah 使用的输入缓冲区的正确定义,但是稍后当您想要遍历实际输入字符串时,您需要跳过前 2 个字节,因为它们不是实际输入文本的一部分!
你可以xor si, si
换成mov si, 2
.
cmp dl, 0 jz .end
DOS 提供给您的输入以回车符(ASCII 13)终止,因此测试零是没有用的。
下面的代码使用AL
代替,DL
因为生成的汇编代码会更短一些。
存在替代解决方案,但这个最接近你得到的:
mov si, 2
.loop:
mov al, buffer[si]
inc si
cmp al, 13
je .end
cmp al, '0'
jb .loop ;notdigit
cmp al, '9'
ja .loop ;notdigit
inc count
jmp .loop
.end:
输出
mov dl, count mov ah, 2h int 21h
此DOS函数需要. DL
您的计数变量只是一个数字,很可能是一个非常小的数字!
您可以通过添加 48 轻松地将 0 到 9 的小数字转换为各自的字符。
mov dl, count
add dl, '0' ;ASCII code for '0' is 48
mov ah, 02h
int 21h
推荐阅读
- javascript - 为什么 cookie 随每个请求一起发送,但在浏览器控制台或 document.cookie 中不可见?
- mysql - 如何在 Amazon LightSales 中更改字符集服务器的属性?
- javascript - 如何在grapesjs中为js代码添加选项?
- mysql - 如何使用spring boot通过邮递员操作数据
- firebase - Firebase 部署错误 - 尝试解析函数触发器时出现未知问题。请确保您使用的是 Node.js v6 或更高版本
- c++ - 为什么即使语句评估为假,我的循环也会在睡眠后连续循环
- mysql - MySQL 分析查询 - 提高性能
- kubernetes - Istio - Kiali - 上游连接错误或在标头之前断开/重置
- php - 如何允许特定域访问 drupal 7 API?
- python - NOT NULL 约束失败:baseapi_movie.admin_id 不使用 django 表单