实验八:
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带来的影响










