汇编实验(分析一个奇怪的程序)

题目:分析下面的程序,在运行前思考:这个程序可以正确返回吗?运行后再思考:为什么是这种结果?通过这个程序加深对相关内容的理解。

 

 1 assume cs:codesg 

 2 codesg segment 

 3              mov ax,4c00H 

 4              int 21H 

 5 start:  

 6              mov ax,0 

 7     s:     

 8              nop 

 9              nop 

10              mov di,offset s 

11              mov si,offset s2 

12              mov ax,cs:[si] 

13              mov cs:[di],ax 

14     s0: 

15             jmp short s 

16     s1: 

17             mov ax,0 

18             int 21H 

19             mov ax,0 

20     s2: 

21             jmp short s1 

22             nop 

23 codesg ends 

24 end start  

 

  首先要明确,EBF6中,F6是位移,而且是二进制的补码形式。转化为10进制,是-10,转化为16进制数,是-Ah,不是什么-10h ,靠后的那个jmp指令位置是1454:0020,占用2个字节。因此,在执行这条指令以前(已取出,放入了缓冲器),ip自加2,指向了下一 条指令的首地址1454:0022,然后执行指令EBF6,0022h-Ah=0018h(16进制减法),翻译成汇编指令是jmp 0018 ,靠前的那个复制过去的指令,复制的是机器码EBF6,占用了1454:0008开始的两个字节单元。因此,执行这条指令时,ip是指向1454:00a0的。00a0-a=0000.翻译成汇编指令是jmp 0000.

1404:001B CD21          INT     21

1404:001D B80000        MOV     AX,0000;复制jmp short s1以前,机器码为EBF6,

1404:0020 EBF6          JMP     0018;此时跳向F6+22=18H

1404:0022 90            NOP

1404:0023 0000          ADD     [BX+SI],AL



1404:0000 B8004C        MOV     AX,4C00;复制jmp short s1后

1404:0003 CD21          INT     21;     jmp short s1d 1404:8处

1404:0005 B80000        MOV     AX,0000;此时跳向f6h+0ah=0处,即1404:0(start)处

1404:0008 EBF6          JMP     0000

1404:000A BF0800        MOV     DI,0008

  总结:一个exe程序中,所有的汇编代码都已经被转化为机器代码,也就是二进制的形式了。debug中的指令,是根据内存单元中的机器代码翻 译过来的。因此,执行复制时复制的是二进制数据,不是指令本身。同一个数据,比如上面的EBF6,在不同的地方,可以解释为不同的汇编指令 jmp 0018 和jmp 0000.当然,如果不包含位移,只包含绝对地址,那么机器指令处在内存中的任何位置,都解释为相同的汇编指令。

 

你可能感兴趣的:(汇编)