首页 > 解决方案 > 无法获得汇编语言代码的输出

问题描述

我是汇编语言的新手。我试图从用户那里获取一串数字,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

 

标签: assemblydosx86-16masm

解决方案


mov ax, @data
mov dx, ax

你想在DS这里初始化段寄存器,但是写错了DX。诚实的错字,但您的代码会以这种方式破坏程序段前缀。

我正在尝试从由 ENTER 键终止的用户那里获取一串数字,或者字符串的长度达到 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:

推荐阅读