assembly - 无法获得汇编语言代码的输出
问题描述
我是汇编语言的新手。我试图从用户那里获取一串数字,Enter或者字符串的长度达到 20。当我执行程序时,它没有显示任何错误,但它既没有显示任何输出,也没有在字符串超过时终止20 个字符的限制。
我的代码是:
.model small
.stack 100h
.data
var1 db 100 dup('$')
.code
main proc
mov ax, @data
mov dx, ax
mov si, offset var1
l1:
mov ah, 1
int 21h
cmp al,20
je programend
mov [si], al
inc si
jmp l1
programend:
mov dx,offset var1
mov ah,9
int 21h
mov ah, 4ch
int 21h
main endp
end main
解决方案
mov ax, @data mov dx, ax
你想在DS
这里初始化段寄存器,但是写错了DX
。诚实的错字,但您的代码会以这种方式破坏程序段前缀。
我正在尝试从由 ENTER 键终止的用户那里获取一串数字,或者字符串的长度达到 20
很明显,您需要一个循环来执行此操作,并且您将需要 2 次测试来决定何时停止!
- 测试字符
AL
是否为 13 - 测试一个计数器(例如
CX
)看它是否达到 20
xor cx, cx ; Empty counter
mov si, offset var1
TheLoop:
mov ah, 01h ; DOS.GetCharacter
int 21h ; -> AL
cmp al, 13
je programend
mov [si], al
inc si
inc cx
cmp cx, 20
jb TheLoop
programend:
但是等等,任务不是说它必须是一串数字吗?您需要确保输入确实是一个数字。
数字“0”到“9”的 ASCII 码是 48 到 57。
xor cx, cx ; Empty counter
mov si, offset var1
TheLoop:
mov ah, 01h ; DOS.GetCharacter
int 21h ; -> AL
cmp al, 13
je programend
cmp al, 48
jb TheLoop ; Not a number
cmp al, 57
ja TheLoop ; Not a number
mov [si], al
inc si
inc cx
cmp cx, 20
jb TheLoop
programend:
不使用单独的计数器并使用汇编器将字符转换为代码的能力:
mov si, offset var1
TheLoop:
mov ah, 01h ; DOS.GetCharacter
int 21h ; -> AL
cmp al, 13
je programend
cmp al, "0"
jb TheLoop ; Not a number
cmp al, "9"
ja TheLoop ; Not a number
mov [si], al
inc si
cmp si, offset var1 + 20
jb TheLoop
programend:
推荐阅读
- reactjs - React.js - 功能组件中的状态未更新
- azure-cosmosdb - Mongo API 投影对 Cosmos 请求单位费用的影响
- python - Opencv waitKeyEx 对多个键使用相同的值
- oracle - 您可以将 SonarLint 添加到 OpenScript OATS 吗?
- javascript - 以 react-hook-form 记录不断变化的输入字段?
- gitlab - gitlab:如何检查提交中的所有更改
- formatting - 如何在不使用类名生成器的情况下设置网格单元格/行背景的样式
- python - Pandas 对行进行切片并将其添加到第一列
- php - Laravel Jobs/Queues - 来自不同 laravel 应用程序的调度作业
- python - 带有 in 运算符的 while 函数不起作用