2013-07-14 2 views
0

Я хотел создать функцию, которая будет печатать на экране массив под названием sol. Расстояние между каждым символом должно быть расположено на 3 "символах" от ech other.
Но, когда я запускаю свой код, печатается только первая строка массива.Почему моя функция не работает? (Assembly)

Вот мой DSEG код:

line db 0 
col db 0 
temp db 3 
indexc dw 0 
sol db 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' 
S_LEN = $- sol 
      db 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p' 
      db '*', '*', '*', '*', '*', '*', '*', '*' 
      db '*', '*', '*', '*', '*', '*', '*', '*' 
      db '*', '*', '*', '*', '*', '*', '*', '*' 
      db '*', '*', '*', '*', '*', '*', '*', '*' 
      db 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p' 
      db 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' 
S_LEN2 = $- sol 

моя функция:

PutPlayers Proc  
    push ax bx cx dx si 

InitiolazingVar: 

    mov temp, offset sol 
    mov line, 1 
    mov col, 1 
    mov si, 1 
Again: 
    ;location 
     mov dl, col 
     mov dh, line 
     mov bx, 0 
     mov ah, 2h 
     int 10h 



    ;printing the char 
     mov al, ds:[temp][si] 
     mov bl, 33 
     mov cx, 1h 
     mov bh, 0 
     mov ah, 9h 
     int 10h 

     add col, 3h 
     inc si 
     cmp si, 9 
     jnz Again 


     add temp, S_LEN 
     mov si, 1h 
     mov col, 1h 
     add line, 3h 

     cmp line, 19h 
     jnz Again 

     pop si dx cx bx ax 
     ret 
PutPlayers endp 

Итак, можете ли вы мне помочь?

+0

'[temp] [si]' означает '[temp + si]', _not_ '[[temp] + si]'. То, что вы, вероятно, хотите, это '[sol] [si]'. Кроме того, ваш индекс ('si') неверен: он должен идти от 0 до 7, а не от 1 до 8 (подумайте о базовом адресе плюс _zero_ как элемент _first_). – Michael

ответ

0

На первый взгляд, мне не нравится инструкцию:

mov al, ds:[temp][si] 

Я думаю, что вы ожидаете, что он будет читать байт из адреса, равной сумме содержания из [TEMP] и содержание СИ.

Но это не тот случай. В этой инструкции, на самом деле, используйте address_of_temp + si. Содержимое [temp] не используется.

Здесь я бы предложил использовать только si в качестве указателя и подумать о других сравнениях о конце цикла.

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