第九章 转移指令的原理
;检测点9.1
;1,程序如下。若要使程序中的JMP指令执行后,CS:IP指向程序的第一条指令,在
;data段中应该定义哪些数据?
assume cs:code
data segment
dw 0 ;测试结果dd,db,dw 都是指向CODE段的开始
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
jmp word ptr [bx+1]
code ends
end start
;2,程序如下。
;补全程序,使JMP指令执行后,CS:IP指向程序的第一条指令
assume cs:code
data segment
dd 12345678H
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov [bx],bx
mov [bx+2],cs
jmp dword ptr ds:[0] ;此题关键是在于dw类型jmp寻址
code ends
end start
;3,用debug查看内存,结果如下:
;2000:1000 BE 00 06 00 00 00 .....
;则此时,CPU执行指令:
;mov ax,2000H
;mov es,ax
;jmp dword ptr es:[1000H]
;后,(cs)=0006,(ip)=00BE
;检测点9.2
;补全编程,利用jcxz指令,实现在内存2000H段中查找第一个值为0的字节,找到
;后,将它的偏移地址存储在DX中。
assume cs:code
code segment
start:
mov ax,2000h
mov ds,ax
mov bx,0
s:
mov cl,ds:[bx] ;置cl位BX的值
mov ch, 0 ;置CX高位为0
jcxz ok ;如果CX为0就转移,如果不为0向下执行
jmp short s
ok: mov dx,bx
mov ax,4c00h
int 21h
code ends
end start
;检测点9.3
;补全编程,利用loop指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它
的
;偏移地址存储在dx中
assume cs:code
code segment
start:
mov ax,2000H
mov ds,ax
mov bx,0
s: mov cl,[bx]
mov ch,0
inc cx
inc bx
loop s
ok: dec bx ;dec自减一
mov dx,bx
mov ax,4c00h
int 21h
code ends
end start
;实验8分析一个程序
assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start: mov ax,0
s: nop
nop
mov di,offset s
mov si,offset s2
mov ax,cs:[si] ;把标号S2处的指令传送到AX寄存器
mov cs:[di],ax ;把AX内容传送到标号S处
s0: jmp short s
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1
nop
codesg ends
end start
;实验九
assume cs:code,ds:data
data segment
db 'W','e','l','c','o','m','e',' ','t','o',' ','m','a','s','m','!'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov bx,071Ah
mov bp,0
mov cx,15
s: mov al,ds:[bp]
mov ah,2h
mov es:[bx],ax
mov al,ds:[bp]
mov ah,24h
mov es:[bx+160],ax
mov al,ds:[bp]
mov ah,71h
mov es:[bx+320],ax
add bx,2
inc bp
loop s
mov ax,4c00h
int 21h
code ends
end start