Может ли кто-нибудь здесь заставить меня понять эту программу и какой выход я получу через это? - PullRequest
0 голосов
/ 01 апреля 2019
DATA SEGMENT
STRING1 DB 11H,22H,33H,44H,55H
MSG1    DB "FOUND$"
MSG2    DB "NOT FOUND$"
SE      DB 34H
DATA ENDS

PRINT MACRO MSG
    MOV AH, 09H
    LEA DX, MSG
    INT 21H
    INT 3
ENDM

CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
    MOV AX, DATA
    MOV DS, AX
    MOV AL, SE
    LEA SI, STRING1
    MOV CX, 04H

UP:
    MOV BL,[SI]
    CMP AL, BL
    JZ FO
    INC SI
    DEC CX
    JNZ UP

    PRINT MSG2
    JMP END1
FO:
    PRINT MSG1
END1:
    INT 3

CODE ENDS
END START

Ответы [ 3 ]

3 голосов
/ 01 апреля 2019

Программа ищет байт '34H' в последовательности 11H, 22H, 33H, 44H.

Секция START выполняет следующие действия:

  • Установите DS: SI по адресу STRING1.
  • Установите AL для байта для поиска за.
  • Установите CX для количества байтов для поиска в STRING1 (4 байт).

Секция цикла выполняет следующие действия:

  • Загрузить байт в DS: SI (из STRING1) в BL
  • Сравните его с байтом для поиска (в AL)
  • если байты равны (нулевой флаг = 1), выведите «Found»
  • иначе (не равно) перейти к следующему байту (INC SI), уменьшить счетчик (CX)
  • если счетчик равен нулю, выйдите из цикла и выведите «NOT FOUND»

Макрос печати:

MOV AH, 09H
INT 21H 

- это вызов MS-DOS для печати до "$" INT 3 означает программу выхода.

Подозрительно, что счетчик CX установлен на 4, но последовательность STRING1 содержит 5 байтов. Не отлаживая программу, я бы сказал, что CX = 5 будет правильным?

0 голосов
/ 01 апреля 2019

Поиск значения 33h в байтовом массиве 11H,22H,33H,44H,55H

DATA SEGMENT
# Data where we will look up for value
STRING1 DB 11H,22H,33H,44H,55H
# message to be printed out
MSG1 DB "FOUND$"
# yet one message
MSG2 DB "NOT FOUND$"
# program will look up for this value
SE DB 33H

DATA ENDS

# this is PRINT macro- will be used later like a function
PRINT MACRO MSG
# 09H - is a function of interrupt 21h - print to console http://spike.scu.edu.au/~barry/interrupts.html
MOV AH, 09H
LEA DX, MSG
# print message using interrupt 21h
INT 21H
# I think it's exit - check it in the x86 interrupts table if you need
INT 3

ENDM # end of print macro

CODE SEGMENT

ASSUME CS:CODE, DS:DATA

START:

# this is the first line of code
MOV AX, DATA
MOV DS, AX
# copy value of SE (33h) to the AL register so later we can compare it
MOV AL, SE
LEA SI, STRING1

# save in CX length of the data to be looked up for value (actually num or iterations)
MOV CX, 04H

# the main loop starts here
UP:
# copy byte from buffer STRING1 to the BL register
MOV BL,[SI]
# check if AL==BL -> value found
CMP AL, BL

# if AL==BLjump to FO (will print FOUND)
JZ FO
# if not found, 
# move to next byte in STRING1
INC SI
# decrement loop constraint (loop should end before reaching end of string)
DEC CX
# if CX <> 0 loop again
JNZ UP
# if CX==0 print message NOT FOUND
PRINT MSG2
JMP END1
FO:
PRINT MSG1
END1:
INT 3
CODE ENDS

END START
0 голосов
/ 01 апреля 2019

Мой голос эквивалентен memchr(s,c,n), где s в SI (увеличивается на каждую итерацию), c в BL (по сравнению с вещью, полученной из SI для выхода 'item found') условие) и n находится в CX (уменьшено до нуля, если элемент массива, равный BL не найден, что является другим условием выхода) плюс дружественный вывод (макрос, содержащий вызов int21h). Смотри http://man7.org/linux/man-pages/man3/memchr.3.html

...