检测点6.1(王爽汇编语言(第3版))
(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 ;设置ds=0
mov bx,0
mov cx,8 ;cs存放循环次数,因为修改8个字,故循环次数为8
s:mov ax,[bx] ;将ds:[bx]中的数据送入ax寄存器中
mov cs:[bx],ax ;将ax的值回写到code段的前16个字节单元中
add bx,2 ;每次修改2个字节,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,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0 ;10个字单元用作栈空间
start:mov ax,cs
mov ss,ax ;设置栈在代码中的内存,令ss=cs
mov sp,24h ;初始化栈顶指针,栈顶指针应该是16+20=36==24H,sp=0024H
mov ax,0
mov ds,ax ;将ds指向0000段地址的空间
mov bx,0 ;初始化偏移地址
mov cx,8 ;循环次数为8次
s:push [bx] ;将ds:[bx]数据压栈
pop ss:[bx] ;将栈内数据弹栈到SS:00~0f
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start