|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 奥普瓯江 于 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, [bx]
- mov cs:[bx], ax ;在循环的开始cs:[bx]代表数据段dw中的第一个字数据把(ds:[bx])中的数据传给他, 因为用了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 [bx]
- pop cs:[bx] ;把栈中的数据取出放在数据段中,这个程序只用到了栈中的储存位置(ss:[23]和ss:[22])这两个储存字节单元
- add bx, 2 ;因为栈的储存是一个“字”所以出站时只需要把低位储存过去他的下一个高位字节也会自动储存过去,这样就会占两个字节的储存空间所以bx要加2
- loop s
- mov 4c00h
- int 21h
- codesg ends
- end start
复制代码 |
|