Вероятно, действительно новый вопрос (asm в V C ++) - PullRequest
1 голос
/ 05 марта 2011

Я только начал работать со сборкой, так что это, вероятно, очень простой вопрос, но я не могу понять это вообще.

Я создал таблицу со следующими значениями:

РЕДАКТИРОВАТЬ

  .data 

NUMS       WORD 09EEBh, 0B0CFh, 061E5h, 089EDh, 0AF17h, 0D8D1h, 06C1Dh, 0594Eh, 0CF55h 
           WORD 0AFFFh, 05B8Fh, 06164h, 01CF7h, 09A41h, 0A525h, 0A5A1h, 08F05h, 07E4Ch
           WORD 0827Ah, 090B0h, 0722Dh, 0BCCFh, 033ABh, 0DC76h, 085B6h, 0AA5Fh, 03FB3h
           WORD 04BACh, 0B822h, 07768h, 0BF1Bh, 05783h, 07EEBh, 09F22h, 0B85Bh, 05312h
           WORD 05971h, 0B1B6h, 0B16Dh, 054B3h, 073C8h, 0586Bh, 08170h, 06F16h, 092A0h
           WORD 09680h, 0A23Bh, 0B45Dh, 01E91h, 0415Ah, 0B5D9h, 02D02h, 06748h, 03D39h

NUMS_SIZE EQU $ -NUMS

NUMS_LENGTH EQU (NUMS_SIZE / TYPE NUMS)

.code

Но когда я запускаю подпрограмму, чтобы распечатать все значения в NUMS, в ней выводится только первая строка.Может кто-нибудь сказать мне, почему он не печатает всю таблицу?

Вот как я печатаю таблицу:

printUnsort proc  ; print out unsorted table

mov ecx, NUMS_LENGTH
mov edi,0
mov edx, OFFSET s


.WHILE ecx > 0  
    .IF pcount != 9

        mov ax, (NUMS[di])

        call WriteHexB
        call WriteString
        add edi, TYPE NUMS
        inc ax
        dec ecx
        inc pcount
    .ELSE
        Call CrLf
        mov pcount, 0
    .ENDIF
.ENDW

ret
printUnsort endp

Любая помощь или совет будут очень полезны.Спасибо!=)

Ответы [ 3 ]

3 голосов
/ 05 марта 2011

Проблема здесь в том, что LENGTHOF (а также SIZEOF) предполагает, что массив начинается и заканчивается одним объявлением данных.В вашем случае это 9 слов, независимо от того, что у вас есть еще 45 слов, следующих за ним.Как правило, это можно исправить двумя способами:

Использовать одно объявление данных (обратите внимание на использование продолжения строки):

NUMS WORD 1, 2, 3, 4, \
          5, 6, 7, 8, \
          ...

Однако вы, скорее всего, столкнетесь с длиной строки MASMограничения с вашей декларацией в одну строку.Следовательно, вы можете использовать этот обходной путь, поместив его сразу же после вашего первоначального объявления NUMS:

NUMS_SIZE EQU $-NUMS
NUMS_LENGTH EQU (NUMS_SIZE / TYPE NUMS)

и использовать «NUMS_LENGTH» вместо LENGTHOF NUMS.NUMS_SIZE будет размером массива в байтах (текущее местоположение минус начало массива).

2 голосов
/ 05 марта 2011

Хотя я не уверен, я бы предположил, что LENGTHOF NUMS - это только длина первой строки. Попробуйте использовать только одно ключевое слово WORD и поместите его в одну строку или используйте запятые или что-то в этом роде. Я недостаточно знаком с MASM, чтобы точно сказать, как вы должны это делать.

1 голос
/ 05 марта 2011

Обработка переменной pcount действительно неясна, но, безусловно, выглядит неправильно. Я предполагаю, что это считает слова, написанные на каждой строке. Когда он достигнет 9, вы только захотите вывести crlf, затем сброс значение обратно на 0. Этого не происходит, оно будет равно 9 только один раз.

Следующее, на что нужно обратить внимание, это то, что вспомогательные функции делают с переменными регистра. Я не помню точных правил, но я думаю, что вы можете только предполагать, что значения esi и edi сохранены. Вам нужно нажать / выдвинуть остальные.

Используйте отладчик.

...