关于汇编的几个算法求汇编大神解答一下详细一点谢谢了

第一个问题1)当前CS=2000H,IP=0000H,则CPU从内存2000H×16+0=20000H处读取指令,读入的指令是:B82266(movax,6622H),读... 第一个问题 1) 当前CS=2000H,IP=0000H,则CPU从内存2000H×16+0=20000H处读取指令,读入的指令是:B8 22 66(mov ax,6622H),读入后IP=IP+3=0003H这里CPU从内存2000H×16+0=20000H处读取指令算法是 cs2000x10+ip0000=20000对应读入的指令是:B8 22 66(mov ax,6622H) 这里的B8 22 66(mov ax,6622H)是怎么来的B8代表ax寄存器吗 那么他22 66变6622这个又是怎么算出来的 2.读入后IP=IP+3=0003H 这里他IP是0000=0000+3=00003是怎么算出来的 这个3是哪里来的怎么算的 (2) 指令执行后,CS=2000H,IP=0003H,则CPU从内存2000H×16+0003H =20003H处读取指令,读入的指令是:EA 03 00 00 10(jmp 1000:0003),读入后IP=IP+5=0008H; 问题这里的指令执行后,CS=2000H,IP=0003H 找IP=0003 刚才算出来的 他是怎么运行让他 2000H×16+0003H =20003H处读取指令执行这里了 读入的指令是:EA 03 00 00 10(jmp 1000:0003),读入后IP=IP+5=0008H;这里的IP+5 又怎么算出来的另外下面那些问题算法是不是都一样(3) 指令执行后,CS=1000H,IP=0003H,则CPU从内存1000H×16+0003H =10003H处读取指令,读入的指令是:B8 00 00(mov ax,0000),读入后IP=IP+3=0006H;(4) 指令执行后,CS=1000H,IP=0006H,则CPU从内存1000H×16+0006H =10006H处读取指令,读入的指令是:8B D8(mov bx,ax),读入后IP=IP+2=0008H;(5) 指令执行后,CS=1000H,IP=0008H,则CPU从内存1000H×16+0008H =10008H处读取指令,读入的指令是:FF E3(jmp bx),读入后IP=IP+2=000AH;(6) 指令执行后,CS=1000H,IP=0000H,CPU从内存10000H处读取指令…… 展开
 我来答
最大的宝宝
2020-01-04 · TA获得超过828个赞
知道小有建树答主
回答量:1569
采纳率:67%
帮助的人:405万
展开全部

看来你对汇编挺有兴趣的,我也科普一些基础知识^_^。

(1)关于指令编码。在本科阶段,老师不会细讲。但官方文档(https://software.intel.com/en-us/articles/intel-sdm)有这方面的基础知识。不过仅建议在积累了足够多的经验值后再去阅读。

如上图,指令格式相当复杂,还好Mov指令相对简单,因为有些可选部分是没有的。

16位dos下的指令

上图为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的也是如此。总之学汇编光说不练绝对是学不精通的,我们当时都是自学的,经常逃课,但因为上手得多,反而学得比较扎实

gcbjoy
2020-01-04 · TA获得超过1.1万个赞
知道大有可为答主
回答量:1.1万
采纳率:92%
帮助的人:2147万
展开全部
问题太多! 先回答(1):
B8 不代表ax,B8代表将立即数传送到寄存器ax中;
6622h 是个字(word)类型的立即数,占用两个字节,在内存中存放时按低字节到低地址、高字节到高地址存放,所以22h在前,66h在后;
由于 b8 22 66 作为一条机器指令,在内存中共占用3个字节,这条指令被读取后自然指令指针ip 下移3个字节。
追问
谢谢 有了你这个思路我感觉下面那几个问题我按照这个思路应该可以解答出来
追答
顶赞 !
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式