当前位置: 代码迷 >> 汇编语言 >> 紧急跪求 王爽《汇编语言》中的小小疑点
  详细解决方案

紧急跪求 王爽《汇编语言》中的小小疑点

热度:2657   发布时间:2013-02-26 00:00:00.0
紧急跪求 王爽《汇编语言》中的小小问题
问题:

(1)编程,向内存0:200~0:23f依次传递数据0~63(3fh),程序中只能使用9条指令,9条指中包括“mov ax,4c00h”和“int 21h”。
 
(2)下面的程序功能是将“mov ax,4c00h"之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。

答案:

assume cs:code  
code segment  
  mov ax, code ;或mov ax, cs 
  mov ds,ax  
  mov ax,0020h  
  mov es,ax  
  mov bx,0  
  mov cx, 18h ;或mov cx, 17h ;或sub cx,5
  s: mov al,[bx]  
  mov es:[bx],al  
  inc bx  
  loop s  
  mov ax,4c00h  
  int 21h  
code ends  
end
看不懂这段程序为什么能将数据0-23传递到内存0:200—0:23f之中??
(1)最主要的是这句指令: mov al,[bx] .这句指令执行时就相当于将ds:bx或者说cs:bx或者说code:bx中的内容转移到al之中。这句指令第一次执行时为什么ds:bx或者cs:bx或者code:bx中存贮的是数据0呢???不一定吧???
(2)循环次数的这句指令 mov cx, 18h ;或mov cx, 17h ;或sub cx,5为什么是18h或者17h或者sub cx 5啊,我千思不得其解啊????
(3)我是大菜,希望高人们用最通俗易懂的,简单的,入门级的语言解释一下问题(1) (2)和其中向关联的知识。多谢啦!


------解决方案--------------------------------------------------------
1.mov al,[bx]之前有 mov bx,0,所以ds:bx存贮的是数据0。
这是指取ds:0000中的数据。注意[]是以bx中的值为地址,去取那个地址中的值。
2.循环次数的这句指令 mov cx, 18h 就是16+8=24次。就是 0-23。
“;或mov cx, 17h ;或sub cx,5”应该是多余的。


------解决方案--------------------------------------------------------
首先,
程序取得内容是用ds:[ bx ],给al,然后al再给es:[ bx ]

ds指向的是code段,或者说的cs段地址,
es指向的是0020h(根据 mov ax,0020h mov es,ax )

这样就清楚了,ds指向的是代码段,es搭配偏移地址指向0:200~0:23f,
也就是将ds(程序代码段),复制到es指向的(0:200~0:23f)段中




另:不知道楼主的标准答案是从哪里来的,我翻了一下我那儿的标准答案,下面是我找到的:



(2) 编程,向内存0:200~0:23F依次传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括“mov ax,4c00h”和“int 21h”。

程序如下:

Assembly code
assume cs:codesgcodesg segment     mov ax,0020h     mov ds,ax     mov bl,0     mov cx,40hs:   mov [bx],bl     inc bl     loop s      mov ax,4c00h     int 21h codesg endsend
------解决方案--------------------------------------------------------
这个我也刚看完,学习了,那个循环次数和楼上后面说的一样。先假设,然后debug里看的。。
  相关解决方案