奥普瓯江 发表于 2018-6-8 17:50:56

检测点6.1

本帖最后由 奥普瓯江 于 2018-6-8 18:21 编辑

(1)下面的程序实现依次用内存0:0-0:15单元中的内容改写程序中的数据,完成程序如下:
assume cs:codesg
codesg segment
    dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
start:mov ax, 0
          mov ds, ax
          mov bx, 0
         
          mov cx, 8
          s:mov ax,
          mov cs:, ax    ;在循环的开始cs:代表数据段dw中的第一个字数据把(ds:)中的数据传给他, 因为用了ax所以传输单位是以“字”这个单位计算的
          add bx, 2
          loop s
          mov ax, 4c00h
          int 21h
codesg ends
end start
(2)下面的程序实现依次用内存0:0-0:15单元中的内容改写程序中的数据,数据的传送用栈来进行。栈空间设置在程序内。完成程序如下:
assume cs:codesg
codesg segment
dw 0123h ,0456h, 07879h, 0abch, 0defh, 0ffedh, 0cbah, 0987h
dw 0, 0, 0, 0, 0, 0, 0, 0, 0, 0    ;10个字单元用作栈的空间
start: mov ax, cs       ;debug开始加载程序的时候cs中储存的是执行的段地址,在当前程序中数据和栈段都包含在其中
         mov ss, ax
         mov sp, 24h    ;此处填写24h是因为数据段加上栈段,所得的和是23h在加上栈的指向,多指一个字节所以是24h,在这里需要强调一下他们都是从零开始的
         mov ax, 0h
         mov ds, ax
         mov bx, 0
         mov cx, 8       ;还有这里为什么要写8,个人理解是因为栈的进出栈规则是一次进入1个“字”,一个“字”等于二个字节,出站也是同理,所以只需要循环八次即可
         s:push
         pop cs:    ;把栈中的数据取出放在数据段中,这个程序只用到了栈中的储存位置(ss:和ss:)这两个储存字节单元
         add bx, 2       ;因为栈的储存是一个“字”所以出站时只需要把低位储存过去他的下一个高位字节也会自动储存过去,这样就会占两个字节的储存空间所以bx要加2
         loop s
         mov 4c00h
         int 21h
codesg ends
end start

有关部门临时工 发表于 2018-7-8 14:13:53

第二题的 mov sp, 24h 算错了吧。。。。。。。。总共18个字型数据的空间乘以二是36个内存空间也就是0-35,所以sp再往下移一个应该就是 mov sp,36 才对

有关部门临时工 发表于 2018-7-8 14:22:36

shit我忘了进制了(*/ω\*)

奥普瓯江 发表于 2018-7-9 15:50:49

有关部门临时工 发表于 2018-7-8 14:22
shit我忘了进制了(*/ω\*)

{:5_111:}我也总忘

赛赛要加油 发表于 2018-7-30 17:28:49

一开始没明白看了刚那哥们的留言懂了。感谢!

siugaawai 发表于 2018-11-25 18:36:15

有关部门临时工 发表于 2018-7-8 14:13
第二题的 mov sp, 24h 算错了吧。。。。。。。。总共18个字型数据的空间乘以二是36个内存空间也就是0-35, ...

你看清楚,24h是十六进制,36是十进制

QQ2995859168 发表于 2018-12-29 03:47:03

请问你们是怎么看明白题目是想怎样改的?他有说人倒序了吗?他只是说改写程序中的数据.这个是真的看不懂.请楼主解释一下.(答题能看得懂)

mnb266 发表于 2019-1-3 21:15:16

题目中 s:mov ax,和s:push 的前面不应该加上cs:跟ds:吗?

奥普瓯江 发表于 2019-1-19 00:12:21

mnb266 发表于 2019-1-3 21:15
题目中 s:mov ax,和s:push的前面不应该加上cs:跟ds:吗?

cs:加了在这里ds:中的ds是默认的

暗pluto 发表于 2019-2-21 18:16:01

0:0-0:15不是应该有22个字节吗,如果用16进制算的话

暗pluto 发表于 2019-2-21 18:31:31

siugaawai 发表于 2018-11-25 18:36
你看清楚,24h是十六进制,36是十进制

mov sp,36也是对的,因为编译器是十进制的

大佬哦 发表于 2019-2-22 14:31:21

作业在那???找不到

大佬哦 发表于 2019-2-22 14:31:57

课后作业在那???找不到

奥普瓯江 发表于 2019-2-22 17:11:58

大佬哦 发表于 2019-2-22 14:31
课后作业在那???找不到

去那本书上找王爽写的《汇编语言》第二版,上面有检测点这个标题的,那个就是作业

kikiatw 发表于 2019-10-2 16:38:49

我覺得第二個問題, 棧那邊DW 0 就可以了, 根本也沒必要弄那麼多0, 多達10個空間, 但是前面九個都是沒在用的

major_lyu 发表于 2020-2-14 20:11:29

有关部门临时工 发表于 2018-7-8 14:13
第二题的 mov sp, 24h 算错了吧。。。。。。。。总共18个字型数据的空间乘以二是36个内存空间也就是0-35, ...

16进制24h就是十进制36

449330787 发表于 2020-3-14 21:30:34

为什么栈段要 和 数据段 一样长,push 进去,马上pop出来, 不需要24h那么长啊,1个字,2个字节的长度也够用啊?
还是说有其他的规定。
页: [1]
查看完整版本: 检测点6.1