1、将下面的程序编译、连接、,用debug加载、跟踪,然后回答问题

assume cs:code,ds:data,ss:stack

data segment

      dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

data ends

stack segment

      dw 0,0,0,0,0,0,0,0

stack ends

code segment

start:     mov ax,stack

            mov ss,ax

            mov sp,16

            mov ax,data

            mov ds,ax

            push ds:[0]

            push ds:[2]

            pop ds:[2]

            pop ds:[0]

            mov ax,4c00h

            int 21h

code ends

end start

查看代码具体执行到哪个单元。

42h包括了data与stack与输出部分三者所占据的代码字节数,减去即为需要实现的代码数

(1)CPU执行程序,程序返回前,data段中的数据为多少?

0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

(2)CPU执行程序,程序返回前,cs=0772h,ss=0771h,ds=0770h

(3)设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1

2、将下面的程序编译、连接,用debug加载、跟踪,然后回答问题

assume cs:code,ds:data,ss:stack

data segment

      dw 0123h,0456h

data ends

stack segment

      dw 0,0

stack ends

code segment

start:     mov ax,stack

            mov ss,ax

            mov sp,16

            mov ax,data

            mov ds,ax

            push ds:[0]

            push ds:[2]

            pop ds:[2]

            pop ds:[0]

            mov ax,4c00h

            int 21h

code ends

end start

 

 反汇编得到需要的字节数,查看寄存器的状态。

1.CPU执行程序,程序返回前,data中的数据为16个字节空间,前两个字数据不变,其余为0。

2.CPU执行程序,程序返回前,cs=076CH,ss=076BH,ds=076AH(与上题一致).

3.设程序加载后。code段的段地址为x,则data段的段地址为x-2,stack段的段地址为x-1。

4.对于如下定义的段:

name segment

...

name ends

如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为N除以16,取整数部分乘16,若余数!=0,则再加上16(N大于16)

若N<16,则补全为16。

N除以16,取整数部分乘16,若余数!=0,则再加上16(N大于16),若N<16,则补全为16。

3、将下面的程序编译、连接,用debug加载、跟踪,然后回答问题

assume cs:code,ds:data,ss:stack

code segment

start:     mov ax,stack

            mov ss,ax

            mov sp,16

            mov ax,data

            mov ds,ax

            push ds:[0]

            push ds:[2]

            pop ds:[2]

            pop ds:[0]

            mov ax,4c00h

            int 21h 

code ends

data segment

      dw 0123h,0456h

data ends

stack segment

      dw 0,0

stack ends

end start

1.CPU执行程序,程序返回前,data段中的数据如上图所示。

2.CPU执行程序,程序返回前,cs=076AH,ss=076EH,ds=076DH.

3.设程序加载后。code段的段地址为x,则data段的段地址为x+3,stack段的段地址为x+4。

4.如果将(1)(2)(3)题中的最后一条伪指令“end start”改为“end”(不指明程序的入口),哪个程序可以正确执行,并说明原因。

第一个程序

第三个程序可以正确执行,因为前两个默认代码的入口为data的入口,而第三个开头即为需要的实现代码,通过更改前两个代码data,stack,code的位置即可以成功执行。

5.程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中。

assume cs:code

a segment

db 1,2,3.4.5.6.7.8

a ends

b segment

db 1,2,3,4,5,6,7,8

b ends

c segment

db 0,0,0,0,0,0,0,0

c ends

code segment

start:

  mov  bx,0

  mov  cx,8

s:  mov dx,0(清零操作)

  mov ax,a(阶段一)

  mov ds,a

  add dl.[bx]

  mov ax,b(阶段二)

  mov ds,ax

  add dl,[bx]

  mov ax,c(阶段三)

  mov ds,ax

  mov [bx],dl

  inc bx

loop s

mov ax,4c00h

int 21h

code ends

end start

结果正确

(6)程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中。

assume cs:code

a segment

dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh

a ends

b segment

dw 0,0,0,0,0,0,0,0

b ends

code  segment

start:

  mov ax,b(栈的设置)

  mov ss,ax

  mov sp,10h

  mov ax,a(当前代码段地址)

  mov ds,ax

  mov cx,8

  mov bx,0

s: push [bx](简单的入栈操作)

  add bx,2

  loop s

mov ax,4c00h

int ax,21h

code ends

end start

结果都是正确的