+ -
当前位置:首页 → 问答吧 → 请进,王爽《汇编语言》教材的实验4

请进,王爽《汇编语言》教材的实验4

时间:2011-02-16

来源:互联网

各位好,王爽《汇编语言》教材的实验4,第3道习题如下:
引用
下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。

assume cs:code
code segment

mov ax,__
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,__
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end



,我的想法是要明确两点:
1)程序指令的起始地址
2)“mov ax,4c00h”之前代码的长度
,但是这些信息要在程序编译连接之后,使用debug载入内存才可以看到,显然在当前是无法确知的

或者只有先编译程序通过之后,使用debug得到以上两点信息,再重新编程

各位都有什么高见,请多指教,多谢了!!

作者: slwj   发布时间: 2011-02-16

你没有用org设置起始偏移那么起始偏移就是0,如果你要得到代码长度可以放上两个label一减就知道了,如果你一定要提前知道具体数值那你可以生成lst文件就可以知道。

作者: manfeng   发布时间: 2011-02-16

这道题的目的就是锻炼编译+调试的基本使用方法。 

作者: masmaster   发布时间: 2011-02-16

1、指令容量法
首先,在DEBUG下用A命令把"mov ax,4c00h"之前的指令输入到内存,如附图。输入时,cx可随意给个值,输入完毕,用loop指令的下一条指令的地址117减去100(17H),即为cx应该赋的值,即mov cx,17h

2、标号法
assume cs:code  
  code segment
Start:  
  mov ax,cs  
  mov ds,ax  
  mov ax,0020h  
  mov es,ax  
  mov bx,0  
  lea cx,Exit_Proc
  sub cx,offset Start
  s:mov al,[bx]  
  mov es:[bx],al  
  inc bx  
  loop s
Exit_Proc:
  mov ax,4c00h  
  int 21h  
  code ends  
  end Start
----------------------------
assume cs:code  
code segment
mov ax,(CS) ;因为要复制的内容是指令,所以,数据段应与代码段同段
mov ds,ax
mov ax,0020h
mov es,ax
mov cx,(17h) ;"mov ax,4c00h"之前的指令共23个字节
mov bx,0
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
有多少个字节?你如何知道要复制的字节的数量
复制的内容有23个字节,各指令字节数之和,要求熟悉常用指令的字节数。
本题使用的是指令容量法。若允许修改原程序,建议使用标号法。

作者: znxllyuan   发布时间: 2011-02-16