检测点2-学习笔记
本帖最后由 roo66t 于 2021-12-9 17:03 编辑检测点2.1
(1)写出每条汇编指令执行后相关寄存器中的值
mov ax,62627 AX=f4a3H //将62627从十进制转化为16进制
mov ah,31H AX=31a3H //更换AX高位
mov al,23H AX=3123H //更换AX低位
add ax,ax AX=6246H //将值3123相加
mov bx,826CH BX=826CH //复制826CH到BX中
mov cx,ax CX=6246H //将AX的值复制到CX中
mov ax,bx AX=826CH //复制BX值覆盖AX值
add ax,bx AX=04D8H //将AX值与BX值相加(C=12,相加得出24,但这是16进制,24-16=8)
mov al,bh AX=0482H //将BX高位覆盖AX低位
mov ah,bl AX=6C82H //将BX低位覆盖AX高位
add ah,ah AX=D882H //AX高位相加
add al,6 AX=D888H //AX低位相加(6在十进制和十六进制的值都是6)
add al,al AX=D810H //AX低位相加,多出来的值影响不到高位
mov ax,cx AX=6246H //将CX值覆盖AX值
(2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方
mov ax,2
add ax,ax
add ax,ax
add ax,ax //移动2到AX寄存器中,将AX值进行3次相加得出16
检测点2.2
(1)给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围(0010H)到(1000FH)。
解析:公式:物理地址=段地址*16+偏移地址 //偏移地址范围是(0~FFFFH)
假设物理地址为SA,偏移地址为EA
SA=0001H*16+EA(0~FFFFH) //16进制*16=值左移一位
SA=0010H+EA(0~FFFFH)
SA=0010H~1000FH
注:我个人理解*16=后面多加个0,如本题:00010+FFFF,得到结果就为5位的16进制,不然以4位16进制相加,就陷入了进制位省略的误区,欢迎大佬进行讲解。
(2)有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元,则SA应满足的条件是:最小为(1001H),最大为(2000H)。
解析:按照如上公式,20000H=SA*16+EA(0~FFFFH)
20000H/16=SA+EA(0~FFFFH)/16 //将FFFFH换算为10进制 65535/16=4095
2000H=SA+EA(0~0FFFH) //将4095换算为16进制0FFFH
SA=2000H-EA(0~0FFFH)
SA=2000H~1001H
注:如果该题按照位移算法,向右移一位,值位1000.1(2000.0H-FFF.FH),但小数点的段地址没见过,舍弃小数位将无法找寻到20000H单元,也求大佬进行讲解
检测点2.3
下面的3条指令执行后,CPU几次修改IP?都是在什么时候?最后IP中的值是多少?
mov ax,bx //本指令将bx值复制到ax中,此时ip发生第一次变化
sub ax,ax //本指令将ax值相减,得到ax=0,此时ip发生第二次变化
jmp ax //本指令将ax值覆盖偏移地址的值(可以看作mov ip,ax),此时ip发生第三次变化
//第四次变化为上一条指令将IP值变为0
看不懂 大佬
页:
[1]