Title: In Class Program
1In Class Program
- Write, assemble and test a program
- Use the DB directive to define the following list
of numbers and name it array - 31h, 32h, 33h, 34h
- Write instructions to load each number into DL
and display it on the console. (use Int 21h,
function 2h to display the byte in DL on the
console) - Explain why the output is 1234
2Procedure
- Get template
- Make necessary changes.
- Assemble and Link using make16
- Run and debug using Codeview
3Template for Assembler Programs (Spring,
2003)
Program Name
title INCLUDE Irvine16.inc
Data Segment
.data put data here
Code Segment
.code main proc mov ax,_at_data
mov ds,ax initialize DS register put
code here mov ah,4Ch int 21h function 4c
int 21h return to DOS main endp end main
end of program
4Defining Data
- .data
- List byte 31h, 32h, 33h, 34h
5Writing to Standard Output
- Interrupt 21h (MS-DOS Services)
- Function 2
- Write character stored in DL to standard out
- (Appendix C-2, page 652 of Irvine 4th Edition)
- We have to get the data from memory to register
DL and then - Mov ah,2 use the mov instruction to
- store the interrupt 21h function
number in register AH - Int 21h use int instruction to process
- interrupt
6Moving Data from Memory to DL
- MOV destination, source
- The source operand is unchanged!
- Both operands must be the same size
- Both operands cannot be memory operands!
- CS and IP cannot be destination operands
- An immediate value cannot be moved to a segment
register
7MOV Instruction
- MOV reg, reg
- MOV mem, reg
- MOV reg, mem
- MOV mem, imm
- MOV reg, imm
- In real address mode
- MOV r/m16, sreg
- MOV sreg, r/m16
8Moving Data from Memory to DL
- Mov dl, list AL 31h
- Mov dl, list 1 AL 32h
- Mov dl, list 2 AL 33h
- Mov dl, list 3 AL 34h
9Using Direct-Offset Operands
- The data in list (31h, 32h, 33h, 34h) can be
accessed using the label (list). - Putting brackets around the source operand does
not affect the outcome. They are not required by
MASM. - List1 List1
- Use List2, List4, etc for WORD lists
- Use List4, List8, etc for DWORD lists
10Title Writing_1234_to_Screen (1234_2.ASM) INCLUDE
irvine16.inc .data array db 31h,32h,33h,34h use
db to define each element as 1
byte .code main proc mov ax,_at_data copy the
address of the data mov ds,ax segment(_at_data)
into the DS register mov ah,2 int 21 function
2 displays the character in DL mov dl,
array copy 1st byte of array to
dl int 21h mov dl, array1 copy 2nd byte to
dl - uses direct-offset to access list
elements int 21h mov dl, array2 copy 3rd
byte to dl int 21h mov dl, array3 copy 4th
byte to dl int 21h mov ax, 4c00h terminate
program and return to DOS int 21h main endp end
main
11Can INC instruction be used to access different
elements of the list ?
- The INC instruction adds 1 to a single operand
- INC reg/mem
- So can we use
- INC array (example program)
- No! The only practical way to handle an array or
list is to use a register as a pointer and change
the register value to point to different elements
of the list.
12OFFSET Operator
- Returns the offset of a data label.
- In protected mode, an offset is always 32-bits
long - In real mode, an offset is always 16-bits long.
13Change Code to
- Mov bx, OFFSET list
- Mov dl, bx
- Int 21h
- Inc bx
- Mov dl, bx
- Int 21h
- Inc bx
-
- NOTE Inc works because the data is bytes. Use
- Add bx,2 for word size data
- Add bx,4 for Doubleword size data
14LOOP Instruction
- LOOP provides a simple way to repeat a block of
statements a specific number of times. - CX (ECX) is automatically used as the counter
- LOOP destination is put at the end of a section
of code to be repeated. First, CX is
decremented, then CX is compared to zero. - If CX is not equal to zero a jump is taken to the
label identified by destination.
15INCLUDE irvine16.inc .data array db
31h,32h,33h,34h use db to define array COUNT
(-array) The operator gives the value of the
location counter. .code main proc mov ax,
_at_data copy the address of the data segment
mov ds, ax _at_data into the DS
register mov bx, offset array the offset
operator returns the 16-bit offset of a
label mov cx, COUNT set up cx register as a
counter register. mov ah, 02 use function 2
of int 21h - display char stored in dl on
screen LP1 mov dl, bx LP1 is a
label int 21h inc bx loop LP1 decrement cx
if cx not 0,loop back to label LP1. mov ax,
4c00h int 21h main endp end main