汇编语言实用砖第四版课后测试点课后实验继续更新~
实验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段