8086CPU是16位结构,由16根数据总线,所以可以一次传送16位数据(1个字)。
只要在mov指令中给出16位的寄存器就可以进行16位数据的传送了。
mov bx,1000H
mov ds,bx
mov ax,[0] ;1000:0处的字型数据送入ax
mov [0],cx ;cx中的16位数据送到1000:0处
问题3.3
内存中的情况如下图所示,写出下面的指令执行后寄存器ax,bx,cx中的值
分析
使用debug程序模拟上面的代码
1) 布置内存现场
2) 书写汇编
可以观察到此时CS:IP已经指向了我们书写的指令mov ax,1000
3)步进执行
<1> mov ax,1000 => ax = 1000
<2> mov ds,ax => ds = 1000
<3> mov ax,[0] => 取出“1000*16+0 = 10000H”物理地址的内存中保存的字(1123H,16位CPU位2字节),赋值给ax,此时ax = 1123
<4> mov bx,[2] => [2]代表的物理地址是"1000*16+2 = 10002H",对应内存中的字为6622,此时bx = 6622
<5> mov cx,[1] => [1]代表的物理地址是"1000*16+1 = 10001H",对应内存中的字为2211,此时cx = 2211
<6> add bx,[1] => [1]代表的物理地址是"1000*16+1 = 10001H",对应内存中的字为2211,此时bx = 6622+2211=8833H
<7> add cx,[2] => [2]代表的物理地址是"1000*16+2 = 10002H",对应内存中的字为6622,此时cx = 2211+6622=8833H
故答案为:ax=1123,bx=8833,cx=8833
问题3.4
内存中的情况如下图所示,写出下面的指令执行后内存中的值
此题目考的是内存内容复制到寄存器和寄存器内容复制到内存中
mov ax,1000H
mov ds,ax
mov ax,11316
mov [0],ax
mov bx,[0]
sub bx,[2]
mov [2],bx
分析
1) 布置内存现场
2)书写汇编代码
使用a命令跳转到CS:IP所指向的物理地址,这样我们便不必修改CS:IP(CPU会把CS:IP执行的二进制数据当做指令执行)
3) 推测结果
mov ax,1000H => ax = 1000H
mov ds,ax => ds = 1000H
mov ax,11316 => ax = 2c34H
mov [0],ax => 10000字节保存34,10001字节保存2c
mov bx,[0] => bx = 2c34
sub bx,[2] => [2]代表的物理地址是"1000*16+2 = 10002H",对应内存中的字为1122H,此时bx = bx - 1122H = 1b12H
mov [2],bx => 10002字节保存12,10003字节保存1b
4) debug步进验证
结果与分析一致