Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Objective: Learn memory organization/layout, data transfer concepts and instruct

ID: 3598819 • Letter: O

Question

Objective: Learn memory organization/layout, data transfer concepts and instructions, memory access modes, memory allocation, memory size, type and length operators, and single and nested loop instruction.
Requirements:
1. (5 points) Write an assembly program that does the following:
- Define the following value 0506030704080102h in the .data segment using the 64-bit unsigned identifier.
- Find the sum of its words using the PTR operator. The sum should be D17h.
- Store the result in the appropriate N-bit register.
- The direction of adding two words goes from left to right.
2. (5 points) Use a loop instruction with indirect addressing to reverse the elements of an array in place.
- Do not copy the elements to any other array.
- Use the SIZEOF, TYPE, and LENGTHOF operators to make the program as flexible as possible if the array size and type should be changed in the future.
- Use the XCHG instruction.
- The array’s elements are: B, A, D, C, F, E, H, G.
- The array’s elements after running the program should look like: A, B, C, D, E, F, G, H.
3. (5 points) Implement the following expression in assembly language:
for (i = 5; i > 0; i--)
{
for(j = 3; j > 0; j--)
{
y = i + j ;
}
}
- Assume I and j are 32-bit registers and y is a list.

Explanation / Answer

public basmain

basmain proc far

assume cs:cseg,ds:cseg,ss:nothing,es:nothing

push ds ; save ds

xor ax,ax

mov ds,ax ; ds=0

mov si,4f2h ; dos communications area

mov ax,es ; get psp seg

mov [si],ax ; save psp in dos comm area

pop ds ; restore ds

mov si,80h ; point to command line

mov ch,0

mov cl,[si] ; get length of command line

jcxz p025 ; it's zero

p010: inc si

mov al,[si] ; get char from command line

cmp al,'/' ; is it a slash?

jnz p020 ; no

mov ax,[si+1] ; get next 2 chars

cmp ax,':M' ; is it M: ?

jz p030 ; yes

cmp ax,':m' ; is it m: ?

jz p030 ; yes

p020: loop p010 ; check next char

p025: jmp p080 ; no /m: or /M: found

p030: ; found /m: or /M:

add si,3 ; point to first number

mov ax,0

mov bx,0

mov cx,10

p040: mov bl,[si] ; get character

cmp bl,'0' ; out of range?

jb p050 ; yes

cmp bl,'9' ; out of range?

ja p050 ; yes

sub bl,'0' ; convert to binary

mul cx ; multiply ax by 10

add ax,bx ; add new digit

inc si ; point to next char

jmp p040 ; continue

p050: ; got value in ax

cmp ax,64 ; less than 64K?

jb p060 ; yes - print msg

cmp ax,1024 ; greater than 1024K?

ja p060 ; yes - print msg

mov cl,6

sal ax,cl ; convert from KB to paragraphs (*64)

mov bx,es ; get psp

add bx,ax ; new top of memory

mov si,2 ; point to top of memory in psp

mov ax,[si] ; get current top of memory

cmp ax,bx ; is new setting larger?

jae p055 ; no

mov dx,offset msg2 ; yes - print msg

jmp p065

p055: mov [si],bx ; save new top of memory

jmp p080

p060: mov dx,offset msg1 ; print the message

p065: add dx,100h ; fudge for the psp

mov ah,9

int 21h

p080: jmp $$main ; jump to BASIC's start point

msg1 db 'Memory specification must be from 64 to 1024',7,10,13,'$'

msg2 db 'Unable to limit memory',7,10,13,'$'

basmain endp

cseg ends

end basmain ; must be a main program!