王爽 汇编语言检测点6.1

RADG 发布于 2015/02/28 23:56
阅读 2K+
收藏 0

题目:检测点6.1

(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-0-0-15内,如果可以转移过去。那个是不是要把CS 和DS 执行位置调换? 现实中没等我移动过去就被系统踢了出来。我找了空地址,一样把我踢出来,我是这样执行的:
assume cs:abc
abc segment
;dw 0123h,0456h,0789h,0abch,0defh,0fedh,0987h
start : mov ax,1400H
        mov bx,0
                mov cs,ax
                mov cx,8
s:      mov ax,[bx]
                mov ds:[bx],ax
                add bx,2
                loop s
                mov ax,4c00h
                int 21h
abc     ends
end start




加载中
0
_lonely
_lonely

你把 ax的值移到cs中,那么程序不就从cs:ip中读指令了吗?就相当于 ax:ip的指令了!

正确的应该

assume cs:abc
abc segment 
;dw 0123h,0456h,0789h,0abch,0defh,0fedh,0987h
start : mov ax,1400H
        mov bx,0
                mov bx,ax
                mov cx,8
s:      mov ax,cs:[bx]
                mov ds:[bx], ax
                add bx,2
                loop s
                mov ax,4c00h
                int 21h
abc     ends
end start
0
_lonely
_lonely
assume cs:abc
abc segment 
;dw 0123h,0456h,0789h,0abch,0defh,0fedh,0987h
start : mov ax,0   ;这里被你带歪了!这里应该是0
        mov bx,0 ;bx是变量,用来做偏移地址
                mov ds,ax ;把ax的值,也就是0 给到ds
                mov cx,8
s:      mov ax,cs:[bx] ; 这里是先把 cs:0 也就是第一个数据,放到ax中
                mov ds:[bx], ax ;然后把数据放到 ds:[0] ds是0,所以就是0:0中
                add bx,2 ; 通过bx偏移地址的增加。。不断的进行mov
                loop s
                mov ax,4c00h
                int 21h
abc     ends
end start
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部