(2)指令序列如下: mov ax,6622h jmp 0ff0:0100 mov ax,2000h mov ds,ax mov ax,[0008] mov ax,[0002]
2.写出CPU执行每条指令后,CS、IP和相关寄存器中的数值。
指令序列寄存器→ CS IP DS AX BX ↓ 初始值→ 2000H 0000 1000H 0 0 mov ax,6622h 2000H 0003 1000H 6622H 0000 jmp 0ff0:0100 1000H 0000 1000H 6622H 0000 mov ax,2000h 1000H 0003 1000H 2000H 0000 mov ds,ax 1000H 0005 2000H 2000H 0000 mov ax,[0008] 1000H 0008 2000H C389H 0000 mov ax,[0002] 1000H 000B 2000H EA66H 0000
3.再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?
检测点3.2(第70页)
(1)补全下面的程序,使其可以将10000H-1000FH中的8个字,逆序拷贝到20000H-2000FH中。
mov ax,1000H mov ds,ax mov ax,2000H mov ss,ax mov sp,10h
(2)补全下面的程序,使其可以将10000H-1000FH中的8个字,逆序拷贝到20000H-2000FH中。
mov ax,2000H mov ds, ax mov ax,1000H mov ss, ax mov sp,0
检测点6.1(第129页)
(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
(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个字单元用作栈空间,所以栈空间的大小为10*2=20,化成16进制即为14 start: mov ax, codesg;或mov ax, cs mov ss ,ax
mov sp, 24h ;或mov sp, 36 ;10h+14h=24h mov ax,0 mov ds, ax mov bx,0 mov cx,8 s: push [bx]
pop cs:[bx] ;或 pop ss:[bx] ;关键在于cs与ss此时地址相同 add bx,2 loop s
mov ax,4c00h int 21h
codesg ends end start
检测点9.1(第183页)
(1)程序如下:
assume cs:code
data segment dw 2 dup (0) data ends
code segment
start: mov ax, data mov ds, ax mov bx,0
jmp word ptr [bx+1] code ends end start
若要使jmp指令执行后,CS:IP指向程序的第一条指令,在data段中应该定义哪些数据?
答案①db 3 dup (0) 答案②dw 2 dup (0) 答案③dd 0
jmp word ptr [bx+1]为段内转移,要CS:IP指向程序的第一条指令,应设置ds:[bx+1]的字单元(2个字节)存放数据应为0,则(ip)=ds:[bx+1]=0
简单来说就是,只要ds:[bx+1]起始地址的两个字节为0就可以了
相关推荐: