Asm 程序没有输出
Asm program doesnt give output
关于我的那个项目,我正在尝试打印一个数组,但没有任何反应......没有错误或任何事情,唯一发生的事情是用户可以输入 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
我怀疑问题出在你的zoneA、B、C区域。您似乎依赖寄存器来保存数组的长度。我建议您在每个区域中加载和存储实际的数组长度变量。您还在主数组中使用 si
,所以我很确定这是一个错误。
你忘了输入的是一个字符。然而你比较的好像它是一个小值!
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两种情况,需要分别跳转到foundLengthA和foundLengthB
您不能使用 SI
寄存器同时寻址 MainArr 和 Barr!
要么使用
- @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)
关于我的那个项目,我正在尝试打印一个数组,但没有任何反应......没有错误或任何事情,唯一发生的事情是用户可以输入 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
我怀疑问题出在你的zoneA、B、C区域。您似乎依赖寄存器来保存数组的长度。我建议您在每个区域中加载和存储实际的数组长度变量。您还在主数组中使用 si
,所以我很确定这是一个错误。
你忘了输入的是一个字符。然而你比较的好像它是一个小值!
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两种情况,需要分别跳转到foundLengthA和foundLengthB
您不能使用 SI
寄存器同时寻址 MainArr 和 Barr!
要么使用
- @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)