编程、调试具有多个段的程序

一.实验目的:

1.学习[BX]的用法。

2.熟悉loop的用法,理解loop的执行步骤。

3.掌握如何编写及调试包含多个段的程序

二.实验内容:

1.编程、调试具有多个段的程序(p133)

三.实验步骤

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

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

答:,由图可知,data段中数据为第一行1456:0000 23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00

(2)CPU执行程序,程序返回前,cs=   1458h  , ss=   1457h  , ds=   1456h       

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

2.将下面程序编译连接,用debug加载、跟踪,然后回答问题。(自己把内容和步骤都写全

(1)步骤:

一:把下图代码粘贴到D盘(自己的下载盘)的masm的文件夹中。

二:先进行编译、然后进行连接、之后用debug调试即可。

三:这里我们使用r命令,可以查看各寄存器的值。

这里cs表示的是code的段地址,ds表示的是data的段地址,ss表示的是stack的段地址。

四:使用u命令。-u

五:使用g命令。-g

六:使用d命令.-d      这时就可以看到data段的值了。

(2)代码如下:

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  ;ss:sp stack

 

    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段中的数据为多少?

答:,由图可知,data段中数据为第一行1456:0000 23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00

(2)CPU执行程序,程序返回前,cs=   1458h  , ss=   1457h  , ds=   1456h       

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

3.将下面的程序编译连接,用debug加载、跟踪,然后回答问题。(自己把内容和步骤都写全

(1)步骤:

一:把下图代码粘贴到D盘(自己的下载盘)的masm的文件夹中。

二:先进行编译、然后进行连接、之后用debug调试即可。

三:这里我们使用r命令,可以查看各寄存器的值。

这里cs表示的是code的段地址,ds表示的是data的段地址,ss表示的是stack的段地址。

四:使用u命令。-u

五:使用g命令。-g

六:使用d命令.-d      这时就可以看到data段的值了。

(2)代码如下:

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

 

code segment

start:

    mov ax, stack

    mov ss, ax

    mov sp, 16  ;ss:sp stack

 

    mov ax, data

    mov ds, ax

 

    push ds:[0]

    push ds:[2]

    pop ds:[2]

    pop ds:[0]

 

    mov ax, 4c00h

    int 21h

 

    data segment

    dw 0123h, 0456h

    data ends

 

    stack segment

        dw 0, 0

    stack ends

 

code ends

end start

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

答:

由图可知,data段中数据为第一行1456:0000 23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00

(2)CPU执行程序,程序返回前,cs=   1456h  , ss=   145Ah  , ds=   1459h       

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

4.如果将(1)(2)(3)题中的最后一条伪指令 “end start”改为end,则哪个程序仍然可以正确执行?请说明原因。(自己把内容和步骤都写全

第一个代码如下:

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



第二个代码如下:

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  ;ss:sp stack

 

    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



第三个代码如下:

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

 

code segment

start:

    mov ax, stack

    mov ss, ax

    mov sp, 16  ;ss:sp stack

 

    mov ax, data

    mov ds, ax

 

    push ds:[0]

    push ds:[2]

    pop ds:[2]

    pop ds:[0]

 

    mov ax, 4c00h

    int 21h

 

    data segment

    dw 0123h, 0456h

    data ends

 

    stack segment

        dw 0, 0

    stack ends

 

code ends

end

答:第3个程序可以正确执行。因为如果将“end start”改为"end"的话,这样会使第一个,第二个无法从start处开始执行程序,因此不能正确的设置cs所执行的指令。

  1. 程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中。(自己把内容和步骤都写全

步骤如下:

  • 先进行编译、然后进行连接、之后用debug调试即可。

二.使用d命令,-d,查看c段

三.使用u命令,-u

四.使用g命令,-g

五.使用d命令,-d,查看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:

        ?

Code ends

End start

结果如下:

  • 实验心得

   这次实验需要特别注意的是一个字型数据会占用两个字节。前8个字型数据实际占据了16个字节。如果理解成8字节编码就会错误。同时,我们要对逆序保存条件想到栈进行操作。通过这次实验,我学习到了[BX]的用法以及loop的用法,同时,也理解了loop的执行步骤。在修改程序的过程中,如果我们把英文字符写成中文字符,例如:把 “ ,”写成“ ,”,会出现编译错误。最后,也基本掌握了编程、调试具有多个段的程序。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜不下的黄昏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值