gpt4 book ai didi

assembly - 无法获得汇编语言代码的输出

转载 作者:行者123 更新时间:2023-12-02 02:41:59 26 4
gpt4 key购买 nike

我是汇编语言新手。我试图从用户那里获取一串由 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。诚实的打字错误,但您的代码将以这种方式损坏程序段前缀。

I am trying to get a string of numbers from user terminated by ENTER key or the length of string reaches 20

很明显,您需要一个循环来执行此操作,并且您将需要 2 个测试来决定何时停止!

  1. 测试AL中的字符是否为13
  2. 测试计数器(例如 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:

关于assembly - 无法获得汇编语言代码的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63439566/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com