实验八:
assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start:
mov ax,0
s: nop;nop占一字节
nop;jmp short s1
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax;将s2处的2字节指令写到s处
s0: jmp short s;跳转到s处
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1;机器指令:EBF6
nop
codesg ends
end start
标号s处的(IP)=08H
中间4条mov指令将s2处的机器指令EBF6写进s处
s0指令执行,IP跳转到s处,此时(IP)=08H,CPU读取s处的机器指令EBF6,然后(IP)+= 2,(IP)=0AH。
执行指令,因为jmp short是用需要转移的位移来实现跳转,F6补码,表示-10,意思是从当前位置回退10个字节,即(IP)-= 10,此刻(IP)= 0,
执行mov ax,4c00H
实验九:
中间位置在12行,13行,14行;对于列,64+32+64=160
assume cs:code
data segment
db 'welcome to masm!'
db 02h,24h,71h
data ends
stack segment
dw 8 dup(0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,0B87cH;0B80H+160*12+64
mov es,ax
mov ax,stack
mov ss,ax
mov sp,8
mov di,0
mov cx,3
mov bx,10h
s: mov ah,ds:[bx] ;颜色赋值
push cx
push bx
mov cx,16;内循环次数
mov bx,0;显存空间中每个字符偏移量
mov si,0;data段里字节偏移量
s1: mov al,ds:[si]
mov es:[di+bx],ax
inc si
add bx,2
loop s1
pop bx
pop cx
add di,0a0h
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
不知为啥不在中间,感觉是执行-g带来的影响