懂汇编的进来,请教一个简单的汇编问题。(100分)

  • 主题发起人 主题发起人 sunnyfairy
  • 开始时间 开始时间
S

sunnyfairy

Unregistered / Unconfirmed
GUEST, unregistred user!
在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 =
mov bx, [0001] //bx =
mov ax, bx //ax =
mov ax, [0000] //ax =
mov bx, [0002] //bx =
add ax, bx //ax =
add ax, [0004] //ax =
mov ax, 0 //ax =
mov al, [0002] //ax =
nov bx, 0 //bx =
mov bl, [000c] //bx =
add al, bl //ax =
代码:

能写出答案并能解释一下。
 
看书,弄清楚 段址:偏移 的地址 和 物理地址的对应关系,1:0 = 0:10
 
汇编都是以前在学校里学过,现在基本上都忘的差不多了。[:)]所以,如果说错莫怪。:P
要解释下面的代码,必须知道下面的地址是如何转换的,在80X汇编中,ds:[0]的计算物理地址公式:ds * 10h + offset,如下面的列子ds=1(mov ds,ax),所以mov ax,[0000]就是取mov ax,[0010h]的内容(1 * 10h + 0 = 10h),也就是ax = 位移编移的地址10h的数值传给ax,所以ax = 62
mov ax, 1 // ax = 0001
mov ds, ax // ds = 0001
mov ax, [0000] //ax = 2662 (mov ax,[0010h])
mov bx, [0001] //bx = E626 (mov bx,[0011h])
mov ax, bx //ax = E626 (bx = 26)
mov ax, [0000] //ax = 2662 (mov ax,[0010h])
mov bx, [0002] //bx = D6E6 (mov ax,[0012h])
add ax, bx //ax = FD48 (2662 + D6E6)
add ax, [0004] //ax = 2C14 (FD48 + 2ECC and FFFF) 因FD48+2ECC的值大于10000,所以必须截去最高位的1
mov ax, 0 //ax = 0000
mov al, [0002] //ax = 00E6
nov bx, 0 //bx = 0000
mov bl, [000c] //bx = 0026
add al, bl //ax = 010C (00E6 + 0026)
 
后退
顶部