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
结果都是正确的