Question: I am new to assembly language and this is some code that I didn't understand hoping that someone would help with it.

```
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

```

This program is supposed to look for number `(6)` among `1,2,3,4,5,6,7,8,9`

I understand how it works in general but I have a few questions:

1. Why did we use `CLC` and `STC` ?? I know they put `CF` into zero and one but why do we use it??
2. Why did we use `MOV AH,4CH` in after the `EXIT` label??
3. After the start label why did we *say* the following:

MOV AX,DATA  

MOV DX,AX

Why didn't we just *say*:
`MOV DX,DATA`

Lastly, Could someone suggest a good book to learn assembly??

Answer: 
```
MOV AX,DATA

MOV DX,AX

```

This is wrong.

**Correct answer is:** 

```
MOV AX,DATA   

MOV DS,AX

```

we cant send data from memory to segment registers(DS) directly . so we are sending through General purpose registers(AX).
```
MOV AX,DATA
MOV DX,AX

```

is wrong. It must be:

```
MOV AX,DATA
MOV DS,AX

```

We write the address of the data segment to the `DS` register so that cpu knows which address to go look for our data. And we can't write `MOV DS,DATA` because of x86 instruction set limitations, i.e there is not such a function implemented in CPU. You have to use `AX` as a medium whenever writing segment addresses to segment registers.