汇编语言及应用——程序框架理解

一、 实验目的

熟悉程序框架;理解存储器分段的本质及不同段之间的关系。

二、 示例

  1. 将下面的程序编译链接,用debug跟踪,然后回答问题。
datas segment
    dw 0123h, 0456H,0789h,0abch,0defh,0fedh,0cbah,0987h
datas ends
stacks segment
    dw  1,1,1,1,1,1,1,1
stacks ends
codes segment
assume cs:codes,ds:datas,ss:stacks
start:
    mov ax,stacks
    mov ss,ax
    mov sp,16
    mov ax,datas
    mov ds,ax
    push ds:[0]      //0123h
    push ds:[2]      //0456h
    pop ds:[2]      //0456h
    pop ds:[0]      //0123h
    mov ah,4ch
    int 21h
codes ends
end start

⑴ CPU执行程序,程序返回前,datas段中的数据为多少?将截图附在下面。

0123h, 0456H,0789h,0abch,0defh,0fedh,0cbah,0987h
在这里插入图片描述
⑵ CPU执行程序,程序返回前,cs = 0772H、ss = 0771H、ds = 0770H。
⑶ 设程序加载后,codes段的段地址为X,则datas段的段地址为X-2,stacks段的段地址为X-1。
在这里插入图片描述
2.将下面的程序编译链接,用debug跟踪,然后回答问题。

data segment
	dw 0123h, 0456h
data ends
stack segment
	dw 1,1
stack ends
code segment
assume cs:code, ds:data, ss:stack
start:
	mov ax, stack
	mov ss, ax
	mov sp, 16
	mov ax, data
	mov ds,ax
	push ds:[0]
	push ds:[2]
	pop ds:[0]
	pop ds:[2]
	mov ax, 4c00h
	int 21h
code ends
end start

⑴CPU执行程序,程序返回前,datas段中的数据为多少?将截图附在下面。
运行前:0123H, 0456H
在这里插入图片描述
运行后:0456H,0123H
在这里插入图片描述
⑵CPU执行程序,程序返回前,cs = 0772H、ss = 076FH、ds = 0760H。
⑶设程序加载后,codes段的段地址为X,则datas段的段地址为X-2,stacks段的段地址为X-1。将截图附在下面。
在这里插入图片描述
⑷对于如下定义的段:
name segment
……
name ends
如果段中的数据占N个字节,则程序加载后,该实际占有的空间为(N/16)Byte

  1. 将下面的程序编译链接,用debug跟踪,然后回答问题。
code segment
assume cs:code, ds:data, ss:stack
start:
	mov ax, stack
	mov ss, ax
	mov sp, 16
	mov ax, data
	mov ds,ax
	push ds:[0]
	push ds:[2]
	pop ds:[0]
	pop ds:[2]
	mov ax, 4c00h
	int 21h
code ends
data segment
	dw 0123h, 0456h
data ends
stack segment
	dw 1,1
stack ends
end start

⑴CPU执行程序,程序返回前,datas段中的数据为多少?
0123H,0456H
在这里插入图片描述
⑵CPU执行程序,程序返回前,cs = 0770H、ss =076FH、ds = 0760H。
⑶设程序加载后,codes段的段地址为X,则datas段的段地址为X+3,stacks段的段地址为X+4。将截图附在下面。
在这里插入图片描述

  1. 如果把1、2、3题中的最后一条伪指令“end start”改为“end”(也就是说不指明程序入口),则哪个程序能正确执行
    答:第三个程序,程序入口无数据段。

三、 实验题

  1. 编写程序,x , y , z , v 均为16位带符号数,计算 ( v - ( x*y + z – 540 ) ) / x。把源程序附在下面,并把debug单步调试的截图附在下面。
datas segment
dw 0123H, 0456H,0789H,0abcH
datas ends
codes segment
assume cs:codes,ds:datas
start:    
	mov ax, datas
	mov ds,ax
	mov ax,ds:[0]
	mov bx,ds:[2]
    	imul bx
	mov cx,ax
	mov bx,dx
	mov ax,ds:[4]
	cwd
	add cx,ax
	adc bx,dx
	sub cx,540
	sbb bx,0
	mov ax,ds:[6]
	cwd
	sub ax,cx
	sbb dx,bx
	mov bx,ds:[0]
	idiv bx             
   	mov ah,4ch
    	int 21h
codes ends
end start

运行调试截图:
mov ax, datas
mov ds,ax
将数据放入ds中:
在这里插入图片描述
mov ax,ds:[0]
mov bx,ds:[2]
imul bx
xy结果放在dx和ax中:dx:0004H ax:edc2H
在这里插入图片描述
mov cx,ax
mov bx,dx
mov ax,ds:[4]
cwd
add cx,ax
adc bx,dx
将x
y的结果加上z,放在bx和cx中:bx:0004H cx:f54bH
在这里插入图片描述
sub cx,540
sbb bx,0
将 xy + z 的结果减去540,放在bx和cx中:bx:0004H cx:f32fH
在这里插入图片描述
mov ax,ds:[6]
cwd
sub ax,cx
sbb dx,bx
将 x
y + z– 540的结果被v,即0abcH减去,结果放在ax,dx中
ax:178dH dx:fffbH
在这里插入图片描述
mov bx,ds:[0]
idiv bx
v– (x*y + z– 540)的结果除以x,即0123H,最终结果放在ax,dx中
ax:fbafH dx:ffa0H
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值