问题:
(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里看的。。