|
发表于 2013-2-12 21:59:47
|
显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-2-12 23:02 编辑
详细点的意思是啰嗦点么?
在 debug中用 d 0:0 1f 查看内存,结果如下 解题过程可以给我说下吗步骤最好详细点(谢谢)
0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 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,[0000] AX=2662h
mov bX,[0001] BX=E626h
mov ax,bx AX=E626h
mov ax,[0000] AX=2662h
mov bx,[0002] BX=D6E6h
add ax,bx AX=FD48h
add ax,[0004] AX=2C14h
mov ax,0 AX=0
mov al,[0002] AX=00E6h
mov bx,0 BX=0
mov bl,[000c] BX=0026h
add al,bl AX=000Ch
首先制定段地址为1
第一条空 mov ax,[0000],默认DS为段地址,偏移为括号中的0000,那么地址计算就是这样1*10h+0=10h
换算下就是段地址为0,偏移为10h的地方(理由0*10h+10h=1*10h+10h,这两个是同一个地址)
所以mov ax,[0000]就是取0000:0010 中一个字的值 就是这里0000:0010 62 26
由于是反过来读的,所以ax=26 62h
mov bx[0001]同上就是段地址为0000,偏移为11h的地方(红色为偏移11H位置,下面会采取同样的方法)
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88
由于是取一个字的值,所以不只取26一个还得向前取 E6
由于是反过来读的,所以bx=E6 26h
mov ax,bx 就是把BX的值E626h给AX,那么AX就和BX一样是E626H了
mov ax,[0000]不多说
mov bx,[0002] BX=D6E6h
换算下0001:0002,换算完也就是段地址为0000偏移为0012h的地方
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88
由于是取一个字的值,所以不只取E6一个还得向前取 D6
反过来读 所以是 D6E6H
add ax,bx AX=FD48h
AX=2662H,BX=D6E6H
相加等于FD48H,把这个值给AX,所以AX=FD48H
add ax,[0004] AX=2C14h
把AX的值FD48H和段地址为0000偏移为14H的值(2ECCH)相加得到12C14H,AX不够装,最高位舍去,所以AX=2C14H
mov ax,0 AX=0 不多说
mov al,[0002] AX=00E6h 取一个字节所以等于E6H
mov bx,0 BX=0 不多说
mov bl,[000c] BX=0026h 不多说,同上
add al,bl AX=000Ch
AL=E6H,BL=26H E6+26=10CH,把这个值给AL,所以AL=10CH,最高位溢出舍去
AL=0C
所以AX=000CH
|
|