关于汇编的几个算法求汇编大神解答一下详细一点谢谢了
看来你对汇编挺有兴趣的,我也科普一些基础知识^_^。
(1)关于指令编码。在本科阶段,老师不会细讲。但官方文档(https://software.intel.com/en-us/articles/intel-sdm)有这方面的基础知识。不过仅建议在积累了足够多的经验值后再去阅读。
如上图,指令格式相当复杂,还好Mov指令相对简单,因为有些可选部分是没有的。
上图为16位dos下的指令。
上图为64位win 10下看到的指令。可以看到同一个mov ax, 6622h指令,编码多了66,这个是指令前缀,用于限定寄存器是16位的,没有的话,寄存器是32位的(其实就是32位寻址)。
作为对比,又多写了4条指令。我这里只说明在操作码(Opcode)同为8B的情况下,如何根据后一字节(即03、1B和0B)理解指令的含义。根据第一图,知道这个字节称为ModR/M。官方文档上对ModR/M的说明如下:
看红框,分别指出了在使用有效地址[EBX]时,3条指令使用的寄存器。如03,竖着看是使用AL、AX等寄存器的,因为用了66前缀,所以最终确定使用AX。又如0B,竖着看使用CL、CX等寄存器,没用使用前缀,故使用32位的ECX。大意如此。我这里没有细说mov al, [ebx],因为它又使用了不同的指令码。由此可见,指令编码是一个非常复杂的系统。据说总的指令数有上万条,想想都是很了不起的工程。
(2)看了一下你的问题,感觉应该多用debug上手调试,加强直观认识。比如“22 66变6622这个又是怎么算出来的“?8086汇编是小端格式,22 66要反过来看,就是6622。又如,”读入后IP=IP+3=0003H 这里他IP是0000=0000+3=00003是怎么算出来的 这个3是哪里来的怎么算的 “?这还用说吗?刚执行完的指令总长度是3字节,IP要指向下一条指令的起始位置,不加3加什么?那个+5的也是如此。总之学汇编光说不练绝对是学不精通的,我们当时都是自学的,经常逃课,但因为上手得多,反而学得比较扎实
B8 不代表ax,B8代表将立即数传送到寄存器ax中;
6622h 是个字(word)类型的立即数,占用两个字节,在内存中存放时按低字节到低地址、高字节到高地址存放,所以22h在前,66h在后;
由于 b8 22 66 作为一条机器指令,在内存中共占用3个字节,这条指令被读取后自然指令指针ip 下移3个字节。
谢谢 有了你这个思路我感觉下面那几个问题我按照这个思路应该可以解答出来
顶赞 !