2017-02-11 27 views
-3

все еще об этом проекте у меня есть, я пытаюсь напечатать массив, и ничего не происходит ... никаких ошибок или чего-то еще, единственное, что происходит, это то, что пользователь может ввести 9 символов и что он, программа завершает программа должна получить 9 чисел от 0 до 9 и разделить на группы а, Ь и сПрограмма Asm не дает выход

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 

В случаях А и В, необходимо перейти к foundLengthA и foundLengthB соответственно.


Вы не можете использовать SI регистр для решения как MainArr и Барра в то же время!
Либо использовать

  • переменные, как @AustinHastings предложило
  • или же использовать BP регистр с переопределением Явного сегмента mov [ds:Barr+bp], alinc 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) 
+0

Имеет значение, если я использую 'si' в' mainArr' и 'Barr'? –

+0

потому что регистр не используется в обоих местах одновременно –

+0

все еще ничего не печатает –

 Смежные вопросы

  • Нет связанных вопросов^_^