首页 > 编程知识 正文

王爽汇编语言第四版答案解析,汇编语言第四版王爽实验答案

时间:2023-05-04 06:35:40 阅读:106724 作者:3960

汇编语言实用砖第四版课后测试点课后实验继续更新~

实验5编写具有多个段的程序,编译调试一次程序并连接,用debug加载、跟踪,回答问题。

assume cs:code,ds:data,ss:stackdata segment dw 0123h、0456h、0789h、0abch、0defh、0fedh、0cbah、 0987 hdataenndata0stackendscodesegmentstart : movax、stack mov ss、ax mov sp、16 mov ax、data mov ds、 axpushds : [0] pushds : [2] popds : [2] popds : [0] movax,4C00hint21hcodeendsendstart(1) CPU运行程序

从堆栈的性质可以看出,没有任何变化

)2) CPU运行程序,在程序返回之前,cs=04b0h、ss=04afh、ds=0a4eh.(结果因人而异) )。

[导出外链图像失败。 源站可能有防盗链机制。 我们建议您保存并直接上传图片。 (img-RCht4eN4-1635949702387 ) 3358 sehnsucht.top/img/image-2021110319142312.png

)3)程序加载后,设代码段的地址为x,则data段的地址为X-2,stack段的段地址为X-1。

2编译并连接以下程序,用debug加载、跟踪并回答问题。

assume cs:code,ds:data,ss:stackdata segment dw 0123h,0456 hdataendsstacksegmentdw 0,0 stackendscodesegmentststart 3330 16 mov ax,data mov ds,axpushds : [0] pushds : [2] popds : [2] popds : [0] movax,4360程序

)1)在CPU运行程序并返回程序之前,data段中的数据是多少?

从堆栈的性质可以看出,是不变的

)2) CPU执行程序,在程序返回之前,cs=04b0h、ss=04afh、ds=04aeh。

[导出外链图像失败。 源站可能有防盗链机制。 我们建议您保存并直接上传图片。 (img-zUHzVoJ7-1635949702391 ) ) 3358 sehnsucht.top/img/image-2021110319295164.png

)3)程序加载后,设代码段的地址为x,则data段的地址为X-2,stack段的段地址为X-1。

)4)就以下定义的分段而言:

name segment .如果name ends段中的数据位为n个字节,则在加载程序后,段的实际占用空间为(N 15 )/16*16

=16时,以段(即16字节)计算,17~31之间为32字节

感兴趣的朋友请看这边的讨论:https://BBS.csdn.net/topics/390585699

3编译并连接以下程序,用debug加载、跟踪并回答问题。

assume cs:code,ds:data,ss : stackcodesegmentstart : movax,stack mov ss,ax mov sp,16 mov ax,data mov ds, axpushds : [0] pushds : [2] popds : [2] popds : [0] movax,4c 00 hint 21 hcodeendsdatasegmentdw 0123 h,0456hDD

从堆栈的性质可以看出,数据保持不变

)2) CPU执行程序,在程序返回之前,cs=04ae、ss=04b2、ds=04b1。

)3)程序加载后,设代码段的地址为x,则data段的地址为X 3,stack段的段地址为X 4。

将end start替换为end后,程序仍然可以运行,但从整个程序文件的第一段开始执行,而不是从start开始。 如果该段用于存储数据,则将存储的数据转换为汇编指令并执行

5编写代码段中的代码,将段a和段b的数据依次相加,并将结果容纳在段c中

assume cs : codeasegmentdb 1、2、3、4、5、6、7、8 aendsbsegmentdb 1、2、3、4、5、6、7、8 bendscsegmentdb 0、0、0? mov ax,4c00h int 21h code endsend start填充

assume cs : codeasegmentdb 1、2、3、4、5、6、7和8 aendsbsegmentdb 1、2、3、4、5、6、7和8 bendscsegmentdb 0、0和0 ds es:[bx]add ds:[bx]、alinc bxloop smov ax、cmov es、ax; es=cmov bx,0mov cx,8s1:mov ax,ds:[bx]mov es:[bx],axadd bx,2loop s1mov ax,4c 00 hint 21 hcodeendsendsendsendstststart

b:04af

c:04b0

我看到有直接使用ss:[bx]的写法,但是可以试试。 你可以不用我这里的两个循环。 中间组件的错误报告真的很痛苦。 也没有表明哪里错了

编写6代码段中的代码,用推送指令将段a中的前8个字体数据按相反的顺序存储在段b中。

assume cs 3360 codeasegmentdw 1、2、3、4、5、6、7、8、9、0ah、0bh、0dh、0eh、0fh、0 ffhaendsbsegmentdw 0、0、0? mov ax,4c00h int 21hcode endsend start填充

assume cs 3360 codeasegmentdw 1,2,3,4,5,6,7,8,9,0ah,0bh,0dh,0eh,0fh,0 ffhaendsbsegmentdw 0,0,0堆栈空的堆栈位于b上为mov ax,amov es,axmov bx,0mov cx,8s:push es:[bx]add bx,2loop s mov ax,4c 00 hint 21 hcodeendsendstarta 336004 ax

b:04b0

看看第a段吧。 a段定义了04ae:0到04ae:1f的16个字符

b段正常反转a段

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。