王爽《汇编语言》(第三版) 实验8、9:

时间:2023-02-25 11:20:06

王爽《汇编语言》(第三版) 实验8、9:

下面的程序简单分析了一下:

assume cs:code

code 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]
            mov cs:[di], ax
            ;取得s和s2偏移地址分别存放到di和si中
            ;之后将s2处对应的指令转移到s的第一个指令
        s0: jmp short s
            ;跳转到标号s处
            ;具体计算方法为s0处对应IP+2+位移(负数用补码表示)
            ;上面已经将s处的第一条指令更改为了s2的第一条指令
            ;所以会执行jmp short s1指令,但是实际上jmp short s1
            ;的机器码还是s2相对于s1的位移,也就是EBF6
            ;F6为补码表示,-10,由于计算方法为s2对应IP+2-10
            ;故而最终结果就是指令被转移到了s对应IP-8的位置
            ;s对应的IP为0008,因此,最后的结果就是执行cs:0000处
            ;的指令:mov ax, 4c00H,之后执行int 21H
            ;程序正常终止


        s1: mov ax, 0
            int 21h
            mov ax, 0

        s2: jmp short s1
            nop
code ends
end start

debug全屏模式alt+enter
实验9:
代码:

assume cs:code

data segment
    dw 57h, 65h, 6Ch, 63h, 6Fh, 6Dh, 65h, 20h, 74h, 6Fh, 20h, 74h, 68h, 65h, 20h, 77h, 6Fh, 72h, 6Ch, 64h, 21h
data ends

code segment 
start:  mov ax, 0b800h
        mov ds, ax
        mov ax, data
        mov es, ax
        mov bx, 0 
        mov cx, 15h
    s:  mov al, es:[bx]
        mov ah, 02h
        mov ds:[bx], ax
        add bx, 2
        loop s

        mov ax, 4c00h
        int 21h
code ends
end start

效果:
王爽《汇编语言》(第三版) 实验8、9: