Программа сборки 8086 - PullRequest
       6

Программа сборки 8086

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

Я новичок в ассемблере, и это некоторый код, который я не понял, надеясь, что кто-то поможет с этим.

DATA SEGMENT
     VALUES DB 1,2,3,4,5,6,7,8,9
     ITEM DB 6
DATA ENDS
CODE SEGMENT
     ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
       MOV DX,AX
       LEA SI,VALUES
       MOV AL,ITEM
COMPARE: CMP AL,[SI]
         JZ Found
         INC SI
         LOOP COMPARE
         CLC
         JMP EXIT
Found: STC
EXIT: MOV AH,4CH
      INT 21H
      ENDS
CODE END

Эта программа должна искать число (6) среди 1,2,3,4,5,6,7,8,9

Я понимаю, как это работает в целом, но у меня есть несколько вопросов:

  1. Почему мы использовали CLC и STC ??Я знаю, что они помещают CF в ноль и единицу, но почему мы его используем ??
  2. Почему мы использовали MOV AH,4CH после знака EXIT ??
  3. После метки запуска почему мы сказали следующее:

    MOV AX, DATA
    MOV DX, AX

Почему немы просто говорим : MOV DX,DATA

Наконец, кто-то может предложить хорошую книгу для изучения сборки ??

Ответы [ 4 ]

1 голос
/ 21 апреля 2011
MOV AX,DATA

MOV DX,AX

Это неверно.

Правильный ответ:

MOV AX,DATA   

MOV DS,AX

мы не можем напрямую отправлять данные из памяти в регистры сегментов (DS).поэтому мы отправляем через регистры общего назначения (AX).

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

Алгоритм ищет число в списке чисел.

Если оно найдено, устанавливается CF.Если он не найден, CF очищается.

INT 21H - прерывание службы MS-DOS.Функция 4Ch завершает программу с кодом ошибки в AL (который содержит номер, который будет найден).

DATA SEGMENT
     VALUES DB 1,2,3,4,5,6,7,8,9
     ITEM DB 6
DATA ENDS
CODE SEGMENT
     ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
       MOV DX,AX
       LEA SI,VALUES           ; DS:SI points to the VALUES structure
       MOV AL,ITEM
COMPARE: CMP AL,[SI]           ; Compare with number in list
         JZ Found              ; Jump to Found if equal
         INC SI                ; Try next
         LOOP COMPARE          ;
         CLC                   ; Clear CF (not found)
         JMP EXIT              ; Quit
Found: STC                     ; Set CF (found)
EXIT: MOV AH,4CH               ; End program with error code AL = 6.
      INT 21H
      ENDS
CODE END
0 голосов
/ 20 марта 2011

Инструкция LOOP здесь любопытна. Эта инструкция уменьшает CX и переходит только если CX не равно нулю. Это означает, что цикл выполняется CX раз, но CX никогда не устанавливается программой.

CX, вероятно, равен нулю на входе, и первый декремент сделает его 65535, так что он фактически зациклится максимум 65536 раз, выполняя поиск за концом списка, если элемент не найден.

Чтобы исправить это, добавьте MOV CX, ITEM - VALUES перед началом цикла. Поскольку ITEM идет сразу после VALUES, вычитание их адресов даст количество байтов (элементов) в списке.

Зачастую метка добавляется в конец списка, чтобы сделать такие вычисления более надежными.

         VALUES     DB 1,2,3,4,5,6,7,8,9
         VALUES_END LABEL BYTE
         ; ...

         MOV CX, VALUES_END - VALUES
COMPARE: ; ...
         LOOP COMPARE
0 голосов
/ 20 марта 2011
MOV AX,DATA
MOV DX,AX

неправильно. Должно быть:

MOV AX,DATA
MOV DS,AX

Мы записываем адрес сегмента данных в регистр DS, чтобы процессор знал, по какому адресу искать наши данные. И мы не можем написать MOV DS,DATA из-за ограничений набора команд x86, т.е. в CPU нет такой функции. Вы должны использовать AX в качестве носителя всякий раз, когда записываете адреса сегментов в регистры сегментов.

...