2017-02-11 46 views
-3

仍然關於我的項目,即時嘗試打印一個數組並沒有任何反應......沒有錯誤或任何事情,唯一發生的事情是用戶可以輸入9個字符,並且它,程序完成 程序需要0和9分之間獲得了9個號碼組 A,b和CAsm program does not give output

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 
+4

評論你的代碼,特別是如果你想讓別人幫忙。另外,學習使用調試器。 – Jester

回答

0

我懷疑問題出在你的zoneA中,b,C區。您似乎依靠寄存器來保存陣列的長度。我建議你在每個區域中加載和存儲實際的數組長度變量。你還在主數組中使用si,所以我很確定這是一個錯誤。

0

你忘記輸入是一個字符。然而,你把它比作一個小小的價值!

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寄存器,以解決雙方MainArr巴爾在同一時間!
要麼使用

  • 變量,如@AustinHastings建議
  • 否則使用BP寄存器與explicite段重載mov [ds:Barr+bp], alinc bp

有與所展示的方式存在多個問題Aarr array。這是正確的做法:

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) 
+0

的確它很重要,如果我使用'si'兩個'mainArr'和'Barr'? –

+0

因爲寄存器犯規在這兩個地方被使用在同一時間 –

+0

仍然無法打印任何東西 –