. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->[bx]和loop指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验4第一小题如下代码是否正确  [待解决] 回复[ 23次 ]   点击[ 861次 ]  
ngulb
[帖 主]   [ 发表时间: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?
masmaster
[第1楼]   [ 回复时间:2010-06-29 22:45 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
没问题呀, debug一下
kekoa83
[第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
kekoa83
[第3楼]   [ 回复时间:2010-07-04 18:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-11-23 10:14
回复:[第1楼]
------------------
你这个有点问题,程序中应该以16进制数字来写,数字后加h,否则masm编译器会将其认为是10进制数据
lin1712
[第4楼]   [ 回复时间:2010-07-14 13:22 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-06-01 10:03
debug默认都是16进制,所以,debug会失败
towersimper
[第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
towersimper
[第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
towersimper
[第7楼]   [ 回复时间:2010-07-15 22:45 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:3
注册日期:2008-06-12 09:16
先编译连接t4.exe(假设文件名为t4),然后用debug t4.exe进行调试即可。
towersimper
[第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,这样不仅打乱了输入次序,而且也浪费内存空间。
towersimper
[第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来跟踪可执行文件的进度。
towersimper
[第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中输入也输入不进去。
towersimper
[第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单元上。呵呵。
shiduanyu
[第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
masmaster
[第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
towersimper
[第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
详细具体可见我前面的分析。
masmaster
[第15楼]   [ 回复时间:2010-07-17 08:50 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
爱用什么用什么。只要能达到目的
hanqiang
[第16楼]   [ 回复时间:2010-07-18 14:13 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-07-07 20:39
你这个得循环多少次?  没找到循环结束的语句啊!
hanqiang
[第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
masmaster
[第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]指的是同一地址。 怎么能完成传送呢?
towersimper
[第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。明显有问题啊。
comducs
[第20楼]   [ 回复时间:2010-10-17 16:19 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:2
注册日期:2009-08-02 21:21
谢谢啊,我的程序正确,就是地址那里0:200没有加h,所以一直做了N次的调不出结果来!
zhchying450
[第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
zhchying450
[第22楼]   [ 回复时间:2010-10-19 08:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-10-18 20:31
不好意思,发上去才看到那个小问题
redlegend
[第23楼]   [ 回复时间:2010-10-25 01:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-01-29 12:28
200H,注意写上H
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved