(1)编程,向内存0:200~0:23F依次传送数据0~63(3FH).
(2)编程,向内存0:200~0:23F依次传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括"mov ax,4c00H"和"int 21H".
assume cs:code
code segment
mov ax,0020H
mov ds,ax
mov bx,0
mov cx,64
s:mov [bx],bl
inc bl
loop s
mov ax,4c00H
int 21H
code ends
end
(3)下面的程序的功能是将"MOV AX,4C00H"之前的指令复制到内存0:200处,补全程序.上机调试,跟踪运行结果.
assume cs:code
code segment
mov ax,( )补全为: mov ax,cs
mov ds,ax
mov ax,0020H
mov es,ax
mov bx,0
mov cx,( )补全为: mov cx,23 或 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
提示:
(1)复制的是什么?从哪里到哪里?
复制的是程序指令,从初始CS:IP处指令到mov ax,4c00H指令前
(2)复制的是什么?有多少字节?你如何知道要复制的字节的数量?
这点有点疑问,虽然知道MOV CX,()是赋值的需复制指令的长度,可是怎么知道的呀? 我是先用 MOV CX,0编程并编译连接成EXE文件后 又用DEBUG加载程序 用U命令显示后才算出23个字节长度,然后又修改源程序重新编译连接的
应该怎么得出长度呀? 难道要记住每种指令的机器代码长度吗?
- [tinyparticle] 不错,思路清晰 09/29 21:22
- [wsrf] 正确。 09/16 09:22
- [wsrf] 这个用DEBUG查看一下程序所占字节数就可以了,没有必要把每条指令所占字节数都记住,博主的做法是正确 09/16 08:22
- [tinyparticle] 取cx=0(cx取0-ffffh所占字节数是一样的),进debug查看程序总长度。提示:查看书P91 09/11 20:07
- [huibian2009] 呵呵,逻辑错误就是在编译的时候可以通过,但在执行的过程中会发生错误。 09/10 11:39
- [huibian2009] 呵呵,这道题考查的是对栈空时栈顶的设置,可以参考教程上关于栈的相关章节。这道题应该是选第1个。 09/09 08:37
- [911911] 谢谢已改正 09/08 15:51
- [wsrf] (1)说修改的内容的时候应该是从高字节到低字节写起。如内存单元220FE存储的字为5CCA,而不应该 09/08 08:53
- [911911] 改正了, 特意看了看前面章节的举例 才发现举的DEBUG操作时 数据是不加H的 写段程序指令时数据都 09/07 11:26
- [mywiil] debug下默认的就是16进制,所以不用加H,但是源代码中是需要加H的,因为源程序在编译的时候,数据 09/07 09:12
[ tinyparticle 发表于 2009-09-11 20:07 ]
取cx=0(cx取0-ffffh所占字节数是一样的),进debug查看程序总长度。提示:查看书P91页,图4.19
最后2条命令mov ax,4c00H int 21H 占5个字节(可在debug中查看得知)
那么: 整个程序长度为1CH-5H=17H或23
[ wsrf 发表于 2009-09-16 08:22 ]
这个用DEBUG查看一下程序所占字节数就可以了,没有必要把每条指令所占字节数都记住,博主的做法是正确的。