内存地址的表示方法0:200~0:20b为什么等同于0020:0~0020b单元?

2024-05-16

1. 内存地址的表示方法0:200~0:20b为什么等同于0020:0~0020b单元?

0:200-0:20b  等价于 0x16h+200--0x16h+20b == 200~20b
0020:0~0020:b  等价于  20x16h+0--20x16h+b  ==  200~200+b == 200 ~ 20b

内存地址的表示方法0:200~0:20b为什么等同于0020:0~0020b单元?

2. 汇编 0000:200 和0020:0 不都是指向 00200吗

的确都是指向00200
但是你的-d 0:200ff是不对的,因为200ff转化成二进制是20位的(物理地址才是20位的),但8086的段地址和偏移地址都是16位的,很明显是不正确的
-d 20:0 ff  查看的物理地址是002ff,如果你第二条指令用-d 0:02 ff  就对了

3. 王爽汇编的实验4 向内存0:200~0:23F依次传送数据0~63 9条指令

不明白 mov[bx],bl    inc bx  ...
-----
开始:

BL = 00H,送到逻辑地址 DS:BX,即 0020:0000 单元。

INC  BX,即 0000H + 1 = 0001H,即 BH=00H、BL=01H。
-----

下一循环:

BL = 01H,送到逻辑地址 DS:BX,即 0020:0001 单元。

INC  BX,即 0000H + 1 = 0002H,即 BH=00H、BL=02H。

-----

最后一个循环:

BL = 63 = 3FH,送到逻辑地址 DS:BX,即 0020:003F 单元。

INC  BX,即 0000H + 1 = 0040H,即 BH=00H、BL=40H。

-----
完。

王爽汇编的实验4 向内存0:200~0:23F依次传送数据0~63 9条指令

4. 王爽汇编语言 实验2实验任务2 希望有人解答下啊!!!

这个问题碰到好多人提问了。
关键是你用到的t命令影响了栈。
t是单步调试命令,当使用单步调试时,实际产生了单步中断。CPU会自动把一些值存放到栈中,这样实际上就会把你在程序里压入栈的值给覆盖掉。
你注意看最后一次的r输出,2000:0eh = 3123h,这个结果是正确的,就是你第一次压入到栈里的ax。而2000:08h = 010fh,2000:0ah = 073fh,而073fh:010fh就是push ax这条指令的地址。CPU在你用t命令单步调试的时候,自动做了一些压栈操作。
所以,如果你用t命令调试程序,建议你把sp设置大点。比如mov sp, 100h
另外,由于栈是向下生长的,而单步调试时CPU又会把一些标志放到栈里,所以栈的小地址里的内容,是不确定的,你就不要纠结从0开始的这部分内存了。只关注SP那一块的内容就行了。

5. 王爽汇编语言第三版有个问题不理解

地址 11 (理解为十进制数表示的地址)对应的二进制信息是 1101 0000 00,那么,这显然是一般二进制数格式的逆序表示。即:最左边数字对应最低位地址线,最右端数字对应最高位地址线。
这只要将十进制数对应的10位二进制数表示反过来写就行了。

因此,其它地址对应的信息自然就是这样:
12:0011 0000 00
13:1011 0000 00
14:0111 0000 00

王爽汇编语言第三版有个问题不理解

6. 关于王爽汇编语言检测点6.1的问题的答案解惑

第一个程序:答案是可以的。
解释:我们在前边用dw 0,0,0,0,0,0,0,0,0,0,0只是申请了十个内存单元的空间,在后边将其指定为堆栈时并不一定要用完。多余的两个内存单元里边仍然存储着0,只不过不属于栈的范围;

第二个程序:程序运算过程是这样的:
因为在整个循环体执行过程中ss,ds寄存器中的数是不变的,只有sp和bx在变,也就是栈顶位置和内存单元指针DS:[bx]在变。所以我们只观察sp和bx的变化。
第一次循环:初始时(sp=36,bx=0;)
1.执行push(sp=sp-2=34,bx=0);
2.执行pop(sp=sp+2=36,bx=0);
3.执行add(sp=36,bx=2);
第二次循环:
1.执行push(sp=sp-2=34,bx=2);
2.执行pop(sp=sp+2=36,bx=2);
3.执行add(sp=36,bx=4);
所以此程序一会入栈一会出栈,栈顶就在SS:34和SS:36之间不断切换,只有寻址内存单元0:0~0:15单元的指针DS:[bx]在不断增长,直到访问至0:14结束。

7. 王爽汇编语言的检测点 12.1

8086系统在存储器的最低1KB区域(00000H~003FFH)建立一个中断向量表,存放256个中断类型的中断向量。这1024个单元被分成256组,每组包括4个字节单元,存储一个中断向量的段基址和段内偏移地址,高2个字节用於存放段基址,低两个字节用於存放段内偏移地址。

8086系统把中断向量表中的中断明确分为3个部份:
1.专用中断:类型号0~4(所以中断不是从1开始,而是0)
2.系统备用中断:类型号5~31H
3.用户中断:类型号32H~0FFH

检测点12.1分析:
计算中断服务入口地址的方法是:从内存地址为中断类型码*4和中断类型码*4+2的两个字单元中读取中断处理过程的入口地址设置IP和CS

0000:0000  68 10 A7 00 8B 01 70 00-16 00 9D 03 8B 01 70 00
段基址:偏移地址 0 1 2 3 4 5 6 7 8 - 9 10 11 12 13 14 15(16个bytes,“-”为分隔符,每8个bytes分隔一次)
0号:00A7:1068
1号:0070:108B
2号:039D:0016
3号:0070:108B

3号:IP读取3*4=12的两个bytes就是12和13两个bytes,CS读取3*4+2=14的两个bytes就是14和15两个bytes。

希望能对你有所帮助!

王爽汇编语言的检测点 12.1

8. 汇编王爽老师书本中“检测点10.2”有不明白

兄台 莫慌  首先  ax的值到最后确实是6   我也调试了   有可能是你调试错了    
要是调试错了应该没啥问题了   不过 我还是把问题再说一下吧
1000:0        mov ax,0           
1000:3        call s               
1000:6        inc ax       
1000:7        s:pop ax  
问: ax值多少  ?    答案 : 6
call指令执行  有两个过程       1: 当前ip值入栈   2:跳转到调用的代码段
那 在这个问题中  程序只有一次入栈与出栈,再结合call  所以 ax的值就是当前ip的值 
那为什么是6   不是 3呢?
很简单,因为当前ip的值确实是6,cpu是不会错的,只是我们的理解错了
接着 为何当前 ip 值是6呢?
一条指令如如下执行的 :
1: cpu根据 ip 读指令(也就是从内存到缓冲区)
2:改变ip(指向下一条)
3:执行
那多条指令是如何执行的呢   照着上边重复就行了
所以  先读指令call s     然后ip指向6   接着执行(也就是 1:当前ip入栈 2:跳转)
所以 答案 ax 为 6
最后    手打不易~  你们看着办吧