检测点3.1
本帖最后由 奥普瓯江 于 2018-5-29 00:18 编辑(1)在Debug中,用“d 0000:0000 1f”查看内存,结果如下
0000:0000 70 80 F0 30EF60 30E2-00 8080 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88
下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行完后相关寄存器中的值。
mov ax, 1
mov ds, ax
mov ax, AX = 2662
mov bx, BX = E626
mov ax, bx AX = E626
mov bx, AX = 2662
mov bx, BX = D6E6
addax, bx AX = FD48
addax, AX = 2C14
mov ax, 0 AX = 0000
mov ax, AX = 00E6
mov bx, 0 BX = 0000
mov bl, BX = 0026
addal, bl AX = 000C
(2)内存中的情况如图3.6所示
各寄存器的初始值:CS = 2000H, IP = 0, DS = 1000H, AX = 0, BX = 0;
1 写出CPU执行的指令序列(用汇编指令写出)。
2 写出CPU 执行每条指令后,CS、IP和相关寄存器中的数值。
3 再次体会:数据和程序有区别吗?如何确定内存中的信息那些是数据,那些是程序?
mov ax, 6622H 把6622H付给ax寄存器
jmp 0ff0:0100 跳转到内存地址10000H 段地址是0ff0偏移地址0100
mov ax, 2000H 把2000H付给ax寄存器
mov ds, ax 把通用寄存器ax中的数据2000H付给ds寄存器
mov ax, 把数据段地址2000H内存单元地址0008中的数据C389付给ax每个ax接受一个字两个字节的数据如果指定的是89那调入到ax中就缺少一个字节所以自动加上下一个地址段中的字节C3。
mov ax, 把数据段地址2000H内存单元地址0002中的数据付给ax每个ax接受一个字两个字节的数据道理同上。
mov ax, 6622H AX:6622BX:0000 CS:2000 IP:0003DS:1000
jmp 0ff0:0100 AX:6622BX:0000 CS:0ff0IP:0100DS:1000
mov ax, 2000H AX:2000BX:0000 CS:0ff0IP:0103 DS:1000
mov ds, ax AX:2000 BX:0000 CS:0ff0IP:0105DS:2000
mov ax, AX:C389BX:0000 CS:0ff0IP:0108DS:2000
mov ax, AX:EA66BX:0000 CS:0ff0IP:010B DS:2000
数据和程序在内存中储存时是没有区别的,当被不同的寄存器调用才会产生区别(这句话我自己也没有自信是不是对,还请各位大神耐心指导)
楼主你好,请问jmp 0ff0:0100 就跳转到了10000H Growlanser 发表于 2018-6-3 18:37
楼主你好,请问jmp 0ff0:0100 就跳转到了10000H
ff00h + 100h = 10000h Growlanser 发表于 2018-6-3 18:37
楼主你好,请问jmp 0ff0:0100 就跳转到了10000H
jum跳转应该是0ff0*16+0100 = 10000 dys376820508 发表于 2018-6-3 20:08
ff00h + 100h = 10000h
三楼这个应该是错的吧 奥普瓯江 发表于 2018-6-7 17:42
三楼这个应该是错的吧
和四楼一个意思 dys376820508 发表于 2018-6-3 20:08
ff00h + 100h = 10000h
后面看了视频,回头看秒懂,学习啦 虽然楼主写的是对的但,答案看的好乱,
而且ds,为0001时CS不也应该0001怎么ip变了,CS没变,还有,mov bx,0,mov bl,,之后bx不应该等于0000怎么等于0026了,最后的ax怎么又等于000c了 z1446773686 发表于 2018-6-27 09:21
虽然楼主写的是对的但,答案看的好乱,
而且ds,为0001时CS不也应该0001怎么ip变了,CS没变,还有,mov bx, ...
楼主写的是对的,cs:ip是汇编程序执行指向的地址,ds是内存的地址,所以ds为0001,即指向内存0001,而cs是汇编程序执行的地址,始终不变(除非跳转到别的汇编程序指向的地址,如本实验(2)),偏移地址将会指向下一个指令执行的偏移地址,所以ip会变。
另外,mov bx,0-----是bx=0000
mov bl,【C】是将偏移地址000C里的内容给了bl,即bl=26;其中bl是bx字里的低字节,而bx的高字节bh没说改变,所以还是bh=00 因此bx-0026
mov ax,0-----同理,ax=0000
mov aL,【2】-----ax=00E6 {此处楼主打错了}
add al,bl----------即al=al+bl=E6+26=0C 因此ax=000C
mov ax, 1
mov ds, ax
mov ax, AX = 2662
mov bx, BX = E626
mov ax, bx AX = E626
mov bx, AX = 2662
mov bx, BX = D6E6
addax, bx AX = FD48
addax, AX = 2C14
mov ax, 0 AX = 0000
mov ax, AX = 00E6
mov bx, 0 BX = 0000----楼主我想知道这个bx=0000
mov bl, BX = 0026------执行mov bl,之后 BX怎么变成0026了 ???? 求解!
zhengqiyao.ym 发表于 2019-6-25 17:15
mov ax, 1
mov ds, ax
mov ax, AX = 2662
(1)在Debug中,用“d 0000:0000 1f”查看内存,结果如下
0000:0000 70 80 F0 30EF60 30E2-00 8080 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88
mov ax, 1
mov ds, ax
段地址等于一了
这个是求他的地址0001:000C中储存的数据
实际内存地址是0001C,在内存中0001C中所储存的数据是26(前面bx以归零所以bh高位中没有数据) 楼主这个很好,会的人秒懂,不懂的人肯定会说乱 WUXIE 发表于 2019-10-21 11:07
楼主这个很好,会的人秒懂,不懂的人肯定会说乱
谢谢 互相学习
页:
[1]