(1) 将下面的程序编译连接,用Debug加载,跟踪,然后回答问题.
assume cs:code, ds:data ,ss:stack
data segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h ;dw 即define word ,定义字型数据。
data ends
stack segment
dw 0,0,0,0,0,0,0,0 ;定义8个字型,用作栈空间。
stack ends
code segment
start: mov ax,stack ;这里的stack就是栈的ss段地址。
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段中的数据是:0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h.
2 CPU执行程序,程序返回前,CS=13D7,SS=13D8,DS=13D5.
3 设程序加载后,code段的段地址为X,则data段的段地址为:x-2,stack段的段地址为:x-1.
(2) 将下面的程序编译连接,用DEBUG加载,跟踪,然后回答问题.
assume cs:code, ds:data ,ss:stack
data segment
dw 0123h,0456h ;dw 即define word ,定义字型数据;db即defing byte定义字节型数据.
data ends
stack segment
dw 0,0 ;定义2个字型,用作栈空间。
stack ends
code segment
start: mov ax,stack ;这里的stack就是栈的ss段地址。
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段中的数据为:23,01,56,04.
2 CPU执行程序,程序返回前,CS=13DB,SS=13DA,DS=13D9.
3 设程序加载后,code段的段地址为X,则data段的段地址为:X-2,Stack段的段址为:X-1.
4 对于如下定义的段:
name segment
...
name ends
如果段中的数据占N个字节,则程序加载后,该段的实际占有的空间为:N<=16B,则为16个字节,N>16,则为16的倍数. 即如果N=20,则实际占用空间为:32B.
(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段中的数据为:23,01,56,04,0,...
2 CPU执行程序,程序返回前,CS=13D9,SS=13DD,DS=13DC.
3 设程序加载后,code段的段地址为X,则data段的段地址为:x+3,stack的段地址为:X+4.
(4) 如果将1,2,3题中的最后一条指令"end start"改为"end",则哪上程序仍然可以执行:第三题,因为,代码段在其它段的最前面,也就是说加载程序后,CS:IP指的就是代码段.无需程序入口,可正确执行.
(5) 程序如下,编写CODE代码段中的代码,将a段和b段中数据依次相加,将结果存到C段中.
ssume 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 ax,a
mov ds,ax
mov ax,b
mov es,ax
mov ax,c
mov ss,ax
mov sp,0008h
mov bx,0
mov cx,4
s: mov ax,ds:[bx]
mov dx,es:[bx]
add ax,dx
inc bx
inc bx
push ax
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,a
mov ds,ax
mov ax,b
mov ss,ax
mov sp,0010h
mov bx,0
mov cx,8
s: push ds:[bx]
inc bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
综上所述:我发现在多个段的程序中段地址在不同的段都是以16的倍数而来.
- [chinatree] 对于双重循环取决于LOOP的位置?怎么说呢? 09/29 15:27
- [rotapple] 哦。是edit啊。晕。我以为这个UI界面是你写出来的。 08/25 18:32
- [rotapple] 这是什么书来的?第四章有这东西吗? 我怎么没见过。 08/25 18:30
- [rotapple] 发多张图是这样的。 你先要把图传到某个地方,比如百度空间。 然后再用[img]地址[/img]这 08/25 18:29
- [rotapple] ;这里为什么不是3F呢,因为3F-3F就等于0,loop就停止了。 你问了好多这个。 0-63 08/25 18:25
- [chinatree] 哪个题呀? 08/25 17:29
- [ameteur] 我试着用mov cx,[5],第一次程序可以成功执行,第二次就不行了。 08/25 17:07
- [ameteur] 我知道,但有一个问题,它是从mov ax,4c00H 前的复制,而不是整个,我可以用 sub cx, 08/25 17:05
- [chinatree] 第一个不用dl试试。 第二个可以不用 mov cx,0016h ,因为当程序加载好cx保存的就是 08/23 18:18
- [chinatree] 在多少页呀,起码最上一行和最下一行我就不知道怎么显示的 08/18 11:51
- [scuzg] 我是scuzg,QQ号是914933602,有空联络、讨论哈! 10/10 22:45