【问题标题】:Asm program doesnt give outputAsm 程序不提供输出
【发布时间】:2017-02-11 23:24:21
【问题描述】:

仍然关于我拥有的那个项目,我试图打印一个数组并且没有任何反应......没有错误或任何事情,唯一发生的事情是用户可以输入 9 个字符并且它,程序完成 程序需要得到 0 到 9 之间的 9 个数字并分组 a、b 和 c

MODEL small
STACK 100h
DATASEG
Welcome db "Welcome, please enter 9 numbers between 0 and 9: $"
MainArr db 9 dup(0)
Aarr db 9 dup(0)
Barr db 9 dup(0)
Carr db 9 dup(0)
AarrLength db ?
BarrLength db ?
CarrLength db ?
CODESEG
start:
mov ax, @data
mov ds, ax

mov dx, offset Welcome
mov ah, 9
int 21h
xor di, di
xor bx, bx
mov si, 0
mov cx, 0
jmp gettingInput
gettingInput:
inc cx
cmp cx, 10
je continue
mov ah, 1h
int 21h
mov [MainArr+si], al
inc si
cmp al, 8
jge zoneA
cmp al, 6
jb zoneC
jmp zoneB

zoneA: 
mov [Aarr+bx],al
inc bx
jmp gettingInput

zoneB: 
mov [Barr+si],al
inc si
jmp gettingInput

zoneC: 
mov [Carr+di],al
inc di
jmp gettingInput

continue:

mov cx, 9
xor ax, ax
mov si, offset Aarr
findLengthA:
cmp [si], 0
je foundLength
inc ax
loop findLengthA

foundLengthA:
mov [AarrLength], al 

mov cx, 9
xor ax, ax
mov si, offset Barr
findLengthB:
cmp [si], 0
je foundLength
inc ax
loop findLengthB

foundLengthB:
mov [BarrLength], al 


mov cx, 9
xor ax, ax
mov si, offset Carr
findLengthC:
cmp [si], 0
je foundLength
inc ax
loop findLengthC

foundLength:
mov [CarrLength], al 


mov bl, AarrLength
mov bh, 0
inc bx
inc bx
mov [offset Aarr + bx], '$'
mov si, offset Aarr
printA:
mov ah, 9h
mov dx, offset Aarr
int 21


exit:
mov ax, 4c00h
int 21h
END start

【问题讨论】:

  • 注释您的代码,尤其是如果您希望其他人提供帮助。另外,学习使用调试器。

标签: assembly x86 dos


【解决方案1】:

你忘记了输入是一个字符。然而你却把它当作一个小值来比较!

mov ah, 1h
int 21h
mov [MainArr+si], al
inc si
cmp al, "8"      <--- Compare as character
jge zoneA
cmp al, "6"      <--- Compare as character
jb zoneC
jmp zoneB

由于这个错误,所有数据都落在了 Aarr 中。幸运的是,由于其他错误!
请注意:

  • zoneA 得到“8”、“9”
  • zoneB 得到“6”、“7”
  • zoneC 得到“0”、“1”、“2”、“3”、“4”、“5”

这似乎不是你想要的,看看你之前的问题!!!


je foundLength

在A和B的情况下,需要分别分支到foundLengthAfoundLengthB


您不能同时使用SI 寄存器来寻址MainArrBarr
要么使用

  • 建议使用 @AustinHastings 等变量
  • 或者使用BP 寄存器和明确的段覆盖mov [ds:Barr+bp], al inc bp

显示 Aarr 数组的方式存在多个问题。这是正确的方法:

mov  bl, AarrLength
mov  bh, 0              <--- No need to use INC BX twice
mov  [Aarr + bx], '$'
mov  ah, 09h
mov  dx, offset Aarr
int  21h                <--- Don't forget the "h" for hexadecimal

为了确保您在 3 个数组中的每一个中搜索终止零成功,请将存储空间设为 10 个字节。如果所有 9 个输入都进入同一个数组,您仍然会找到一个终止零。

Aarr db 10 dup(0)
Barr db 10 dup(0)
Carr db 10 dup(0)

【讨论】:

  • 如果我在mainArrBarr 中都使用si 有关系吗?
  • 因为寄存器不会同时在两个地方使用
  • 仍然不打印任何东西
【解决方案2】:

我怀疑问题出在您的 zoneA、B、C 区域。您似乎依靠寄存器来保存数组的长度。我建议您在每个区域中加载并存储实际的数组长度变量。您还在主数组中使用了si,所以我很确定这是一个错误。

【讨论】:

    猜你喜欢
    • 2021-09-18
    • 2019-03-24
    • 2023-03-08
    • 2019-08-03
    • 2022-01-25
    • 1970-01-01
    • 2012-12-08
    • 2022-11-25
    • 1970-01-01
    相关资源
    最近更新 更多