程序方面高手进
- 提问者网友:黑米和小志
- 2021-05-04 16:33
- 五星知识达人网友:逃夭
- 2021-05-04 18:12
这种东西不好做,麻烦。你还是去威客网站去发布任务吧,那边有人接
- 1楼网友:怙棘
- 2021-05-04 19:09
12H (十进制18) *4 = 48H (十进制72)
8H(十进制8)*4 = 20H(十进制的32)
(2)
前题A: SP是堆栈寄存器, 堆栈是向下生长的(减法), SS是是源地址段寄存器, FLAGS是运行标志寄存器, IP是当前运行代码指针地址寄存器
前题B: FLAGS标志寄存器是16位特殊寄存器, 其各个位的定义, 其中第0.2.4.6.7.8.9.10.11分别为CF.PF.AF.ZF.SF.TF.IF.DF.OF, 这里的第9位IF就是代表interrupt Flag发生中断的标志位.
前题B: 当中断发生时,系统将标志寄存器flags,下一条指令的地址CS:IP的值分别压入堆栈,然后将中断服务程序的入口地址装入CS和IP寄存器。这样控制就转到中断服务程序。中断返回时,系统从栈顶分别弹出CS、IP、flags的值,CPU断续从断点开始执行。
前题B: INT8 是调用8号中断, 在DOS中8号是时钟中断, 发生中断时,中断的位置是固定的,计算方法就是(1)里的方式,对于INT8,其中断程序的入口地址在20H和21H,即0040H 和0100H.
于是, 当执行INT8时, 首先把原FLAGS 0240H入栈保存, SP需要减2两字节, 然后把当前地址0900H:00A0H 的下一地址(返回位置) 0900H:00A1H入栈保存,高位先进,然后SP需要减去4字节, 最后SP为0100H-6H=00FAH, 然后根据8号中断得到20H和21H处的地址0040H:0100H装载到CS:IP中以便进行跳转执行, 于是SS不变,CS和IP分别变为0100H和0040H,同时FLAGS里面的中断位发生变化,从而变成0040.
于是你的结果就出来的.
(3) 你去搞懂几种寻址方式就可以了: 直接寻址就是拿一个数字(非寄存器)当成地址,把对应地址上的数据取出来; 寄存器直接寻址就是把寄存器的数值当成结果; 寄存器间接寻址就是把寄存器的数值当成内存地址,把对应内存地址中的数据取出来; 存储器间接寻址就是把存储器里面的内容当成地址,再取那个地址上的数据.
有了这些解释,你的答案就好找了. 最后是否有PC,跟你的指令有关, 就是在计数的时候要考虑进PC, 根据最后的结果去内存的相应地址取数据.
- 2楼网友:一秋
- 2021-05-04 18:34
你这个是“麻雀虽小,五脏据全”的一个软件啊
做出来的话,也得不少钱
如果这样的话,你不如做一个表格,成本多低啊,只是不能打小票而已