|
主题 : : 实验4第一小题如下代码是否正确 [待解决] |
回复[ 23次 ]
点击[ 861次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-06-29 22:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-06-29 19:56 |
请各位大侠看下,实验室第一小题使用下面的代码是否正确?
assume cs:code
code segment
mov ax,0
mov ds,ax
mov bx,200
mov dl,0
mov cx,64
s: mov [bx],dl
inc dl
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
编译运行了下,得不到想要的结果,难道段地址不能设为0? | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-06-29 22:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
|
|
|
|
|
[第2楼]
[ 回复时间:2010-07-04 18:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-11-23 10:14 |
看看我做的实验4-(1):编程,向内存0:200~0:23F一词传送数据0~63(3FH)?
---------------------------------------------------------------------
assume cs:mycode
mycode segment
mov ax,0h
mov cx,40h ;寄存器cx存储需传送数据个数:40h个
mov ds,ax ;将数据段寄存器ds初始化为0000h
mov bx,0h
s: mov [bx+200h],bx ;将寄存器bx中的内容传给内存0000:0200
inc bx ;(bx)=(bx)+1,寄存器bx中内容自加1
loop s ;判断cx值是否为0,不为0则跳转至s:处执行
mov ax,4c00h
int 21h
mycode ends
end | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-07-04 18:40 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-11-23 10:14 |
回复:[第1楼]
------------------
你这个有点问题,程序中应该以16进制数字来写,数字后加h,否则masm编译器会将其认为是10进制数据 | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-07-14 13:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-06-01 10:03 |
debug默认都是16进制,所以,debug会失败 | | |
|
|
|
|
[第5楼]
[ 回复时间:2010-07-15 22:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-06-12 09:16 |
assume cs:code
code segment
mov ax,20H
mov ds,ax
mov bx,0
mov cx,64
s:mov [bx],bl
inc bx
loop s
mov ax,4c00H
int 21H
code ends
end | | |
|
|
|
|
[第6楼]
[ 回复时间:2010-07-15 22:41 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-06-12 09:16 |
mov ax,0这样同样也能达到ah=0,al=0的目的。另外,inc bx每次加1,总共加64次,加的结果都只是在bx的低八位(即bl)上进行,而高八位依然都是0,即bh=0000.这样就可以达到题目的要求。当然题目所说的9条指令应该指的是指令,而不应该包括伪指令。我用debug调试了一下,然后用d 0020:0 3f查询了一下,结果为
0020:0000 00 01 02 03 04 05 06 07-08 09 0A 0B 0C 0D 0E 0F
0020:0010 10 11 12 13 14 15 16 17-18 19 1A 1B 1C 1D 1E 1F
0020:0020 20 21 22 23 24 25 26 27-28 29 2A 2B 2C 2D 2E 2F
0020:0030 30 31 32 33 34 35 36 37-38 39 3A 3B 3C 3D 3E 3F | | |
|
|
|
|
[第7楼]
[ 回复时间:2010-07-15 22:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-06-12 09:16 |
先编译连接t4.exe(假设文件名为t4),然后用debug t4.exe进行调试即可。 | | |
|
|
|
|
[第8楼]
[ 回复时间:2010-07-15 23:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-06-12 09:16 |
看看我做的实验4-(1):编程,向内存0:200~0:23F一词传送数据0~63(3FH)?
---------------------------------------------------------------------
assume cs:mycode
mycode segment
mov ax,0h
mov cx,40h ;寄存器cx存储需传送数据个数:40h个
mov ds,ax ;将数据段寄存器ds初始化为0000h
mov bx,0h
s: mov [bx+200h],bx ;将寄存器bx中的内容传给内存0000:0200
inc bx ;(bx)=(bx)+1,寄存器bx中内容自加1
loop s ;判断cx值是否为0,不为0则跳转至s:处执行
mov ax,4c00h
int 21h
mycode ends
end
------------------
回复:为什么mov [bx+200h],bx指令最好改为mov [bx+200h],bl。因为bx是16为寄存器,bx的内容输入到内存,要占2个存储单元,这样的话,由于bh始终为00H,而bl从00H变化到3FH,这样将0到63(对应3FH)输入时候,每个整数之间都要相隔00H,这样不仅打乱了输入次序,而且也浪费内存空间。 | | |
|
|
|
|
[第9楼]
[ 回复时间:2010-07-15 23:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-06-12 09:16 |
回复:[第1楼]
------------------
你这个有点问题,程序中应该以16进制数字来写,数字后加h,否则masm编译器会将其认为是10进制数据
------------------
回复:你看到后面的章节就知道了。如果是直接将汇编指令用-a在debug中输入当然会有问题,但如果将源程序编译连接生成可执行文件(假设文件名为test.exe),则可以通过debug test.exe来跟踪可执行文件的进度。 | | |
|
|
|
|
[第10楼]
[ 回复时间:2010-07-15 23:59 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-06-12 09:16 |
回复:[第1楼]
------------------
你这个有点问题,程序中应该以16进制数字来写,数字后加h,否则masm编译器会将其认为是10进制数据
------------------
回复:你看到后面的章节就知道了。如果是直接将汇编指令用-a在debug中输入当然会有问题,但如果将源程序编译连接生成可执行文件(假设文件名为test.exe),则可以通过debug test.exe来跟踪可执行文件的进度。
------------------
回复:这样就不会有什么十进制数应该以16进制来写的问题了。编译程序能识别整数是否是十进制还是十六进制,证整数后面没有字符的为十进制,后面带h或h的为十六进制。再说,涉及到伪指令,通过-a在debug中输入也输入不进去。 | | |
|
|
|
|
[第11楼]
[ 回复时间:2010-07-16 00:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-06-12 09:16 |
请各位大侠看下,实验室第一小题使用下面的代码是否正确?
assume cs:code
code segment
mov ax,0
mov ds,ax
mov bx,200
mov dl,0
mov cx,64
s: mov [bx],dl
inc dl
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
编译运行了下,得不到想要的结果,难道段地址不能设为0?
------------------
回复:基本上正确,只需改动一个小小的地方,即将mov bx,200中的200后加上h,即改为mov bx,200h,我编译连接测试后就能得到结果。题中说的是0:200~0:23f,这其中的0,200,23f都是十六进制,而你程序中的mov bx,200经编译程序编译时,200是十进制数,转换为十六进制为C8H,所以你的程序执行后,0到63被输入到其他的存储单元,即输到0000:00C8~0000:0107的存储单元上,不信你将自己的程序编译连接测试一下就会发现0~63输入到0000:00C8~0000:0107单元上。呵呵。 | | |
|
|
|
|
[第12楼]
[ 回复时间:2010-07-16 10:10 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-07-13 15:22 |
请各位高手帮我看一下下面代码错在哪里:
assume cs:a
a segment
mov al,0
mov bx,20h
mov ds,bx
mov cx,64
s:mov ds:[al],al
inc al
loop s
mov ax,4c00h
int 21h
a ends
end | | |
|
|
|
|
[第13楼]
[ 回复时间:2010-07-16 12:30 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
请各位高手帮我看一下下面代码错在哪里:
assume cs:a
a segment
mov al,0
mov bx,20h
mov ds,bx
mov cx,64
s:mov ds:[al],al
inc al
loop s
mov ax,4c00h
int 21h
a ends
end
------------------
回复:
修改后的,按注释的地方
1 assume cs:a
2 a segment
3 mov al,0
4 mov bx,20h
5 mov ds,bx
6 mov cx,64
7 mov bx,0 ;初始化目的地址
8 s:mov ds:[bx],al ;8086不允许bx,bp,si,di以外的寄存器作为内存单元寻址。
9 inc al
10 inc bx ;增量
11 loop s
12 mov ax,4c00h
13 int 21h
14 a ends
15 end | | |
|
|
|
|
[第14楼]
[ 回复时间:2010-07-16 22:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-06-12 09:16 |
请各位高手帮我看一下下面代码错在哪里:
assume cs:a
a segment
mov al,0
mov bx,20h
mov ds,bx
mov cx,64
s:mov ds:[al],al
inc al
loop s
mov ax,4c00h
int 21h
a ends
end
------------------
回复:
修改后的,按注释的地方
1 assume cs:a
2 a segment
3 mov al,0
4 mov bx,20h
5 mov ds,bx
6 mov cx,64
7 mov bx,0 ;初始化目的地址
8 s:mov ds:[bx],al ;8086不允许bx,bp,si,di以外的寄存器作为内存单元寻址。
9 inc al
10 inc bx ;增量
11 loop s
12 mov ax,4c00h
13 int 21h
14 a ends
15 end
------------------
回复:说的很好,只是既然如此,为何还要用al传送数值啊,直接用bx/bl传送就好了,既可以减少寄存器的用量,也可以节省内存空间,加快程序编译和运行速度。将程序中的ax或al统统去掉,或用bl代替,如下所示:
1 assume cs:a
2 a segment
3 mov bx,20h
4 mov ds,bx
5 mov cx,64
6 mov bx,0 ;初始化目的地址
7 s:mov ds:[bx],bl ;8086不允许bx,bp,si,di以外的寄存器作为内存单元寻址。
8 inc bx ;增量
9 loop s
10 mov ax,4c00h
11 int 21h
12 a ends
13 end
详细具体可见我前面的分析。 | | |
|
|
|
|
[第15楼]
[ 回复时间:2010-07-17 08:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
|
|
|
|
|
[第16楼]
[ 回复时间:2010-07-18 14:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-07-07 20:39 |
|
|
|
|
|
[第17楼]
[ 回复时间:2010-07-18 14:46 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-07-07 20:39 |
assume cs:code
code segment
mov ax,2000h
mov ds,ax
mov bx,0
mov cx,64h
s:mov,ds:[bx],[bx]
inc bx
loop s
code ends
end | | |
|
|
|
|
[第18楼]
[ 回复时间:2010-07-18 15:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
s:mov,ds:[bx],[bx]
---------------------------------------
1,这样的指令时非法的。mov指令不允许存储单元之间直接传送数据。必须用寄存器中转一下。
2,ds:[bx]和[bx]指的是同一地址。 怎么能完成传送呢? | | |
|
|
|
|
[第19楼]
[ 回复时间:2010-07-19 11:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:9
信誉值:3
注册日期:2008-06-12 09:16 |
s:mov,ds:[bx],[bx]
---------------------------------------
1,这样的指令时非法的。mov指令不允许存储单元之间直接传送数据。必须用寄存器中转一下。
2,ds:[bx]和[bx]指的是同一地址。 怎么能完成传送呢?
------------------
回复:除了你指出的这个问题还有一个简单问题就是,至输入0~63共64各整数,hanqiang程序中用mov cx,64h应改为mov cx,64或者mov cx,40h,想想64h多大的数啊,64h=100。明显有问题啊。 | | |
|
|
|
|
[第20楼]
[ 回复时间:2010-10-17 16:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:2
注册日期:2009-08-02 21:21 |
谢谢啊,我的程序正确,就是地址那里0:200没有加h,所以一直做了N次的调不出结果来! | | |
|
|
|
|
[第21楼]
[ 回复时间:2010-10-19 08:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-10-18 20:31 |
我的程序怎么编译总出现错误,哪里有问题哦?
assume cs:code
code segment
mov bx,20h
mov ds.bx
mov cx,40h
mov bx,0
s:mov ds:[bx],bl
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end | | |
|
|
|
|
[第22楼]
[ 回复时间:2010-10-19 08:38 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-10-18 20:31 |
|
|
|
|
|
[第23楼]
[ 回复时间:2010-10-25 01:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-01-29 12:28 |
|