MOV mem,accum and MOV accum,mem Formats Incorrectly Documented

ID Number: Q39372

5.00 5.10 5.10a 6.00 6.00a 6.00b | 5.00 5.10 5.10a 6.00 6.00a 6.00b

MS-DOS | OS/2

docerr

Summary:

There is a documentation error on page 77 of the "Microsoft Macro

Assembler 5.1 Reference" and page 112 of the "Microsoft Macro Assember

Reference" that comes with MASM 6.0, 6.0a, and 6.0b. The encodings

given for the following forms of the MOV instruction are incorrectly

documented

MOV mem, accum

MOV accum, mem

The manual describes the format of these instructions as 101000dw on

those pages. The section describing the encodings (p. 27 for MASM 5.1

and p. 59 for MASM 6.0, 6.0a, 6.0b) says that a value of 1 for d (the

direction flag) means that the move goes from memory to register and a

0 for d means to move from the register to memory. This results in an

incorrect encoding for these forms of the MOV instruction.

More Information

Page 3-118 of "Intel's iAPX 86/88, 186/188 User's Manual (Programmer's

Reference)" provides the correct information.

MOV mem, accum should be 1010001w

MOV accum, mem should be 1010000w

The assember encodes these instructions using the general case

MOV mem, reg

MOV accum, mem

rather than specifically using the special forms for the accumulator.

The following is an example of how to encode the forms that use the

accumulator by hand.

Sample Code

-----------

;Assemble options needed: none

.model small

.data

foo dw 23

.code

start: MOV ax, @data

MOV ds, ax

memaccum db 0a1h

dw offset foo

accummem db 0a3h

dw offset foo

MOV ah, 4ch

INT 21h

END start