(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
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
// 先想清楚几个问题
用哪里的内容改写程序中的数据
先设置0:0~0:15单元中的段地址
偏移地址都是从0开始的,所以都是用BX表示
数据的长度都是2个字节,所以偏移地址每次都要移动两个字节,也就是bx要加上2
数据从ds:[bx]来, 要放入cs:[bx], 用ax来传递
(2)下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,数据的传
送用栈来进行。栈空间设置在程序内。完成程序:
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0
start: mov ax,____ mov ax,codesg
mov ss,ax
mov sp,____ mov sp=24h
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s: push [bx]
_________ pop cs:[bx]
add bx,2
loop s
mov ax,4200h
int 21h
codesg ends
end start
// 这里首先的问题是设置栈顶,栈段为CS。栈顶24H。24H怎么来的呢
前面定义了8个dw数据,占用了16个内存单元,16进制表示为10H。后面又定义了10个dw的栈空间,
占用了20个内存单元,16进制表示为14H,10H+14H=24H
然后设置ds,把内存0:0~0:15单元的数据入栈,偏移地址从0开始,用bx表示
再出栈地址为代码段中的数据段,段地址为CS,偏移地址也是从0开始,用bx表示
数据的长度,栈操作都为两字节,目标数据长度也为两字节,所以相符合,故每执行一次bx都要加上2
因为不是逆序复制,因为前面做的逆序复制,所以这里一下子没反应过来,
这就是为什么push跟pop会用到一个循环
push一个数据就马上pop出来
被push的数据默认段地址为ds
被pop的数据段地址要明确给出,所以要写出pop的地址。
栈操作用到的空间貌似就2个字节,因此我们的栈段比两字节长就可以了。