. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  第九章 检测点9.2中的疑问  [待解决] 回复[ 27次 ]   点击[ 1031次 ]  
wenh7788
[帖 主]   [ 发表时间:2009-09-07 20:58 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-09-07 20:55
程序如下
利用jcxz指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。    
  assume   cs:code    
  code   segment    
      start:   mov   ax,2000H    
                    mov   ds,ax    
                    mov   bx,0    
              s:    ________    
                    ________    
                    ________    
                    ________    
                    jmp   short   s    
              ok:   mov   dx,bx    
                    mov   ax,4c00h    
                    int   21h          
  code   ends    
  end   start



我的答案是:
mov cx byte ptr[bx]
jcxz ok
inc bx

这样写对吗?
我一开始就是这么写的,可是他给了4个空,搞的我不知道怎么填了,最后跑上来看了下答案才知道的
同时看看我的答案对吗?
谢谢
wsrf
[第1楼]   [ 回复时间:2009-09-08 10:45 ]   [引用]   [回复]   [ top ] 
荣誉值:33
信誉值:0
注册日期:2008-10-16 10:01
你的答案肯定是不正确的,要想验证一下你的程序,可以编译一下,看看能不能通过,编译器会告诉你哪里错了。
给你个提醒:mov cx byte ptr[bx] ,自己再想想吧。
crg007
[第2楼]   [ 回复时间:2009-09-13 11:49 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:4
注册日期:2009-07-29 23:59
1、“mov cx byte ptr[bx]”首先你的语句CX后面少了一个“,”号,其次有寄存器cx参与寻址就不需要byte ptr来指定内存单的长度!因为寄存器cx已指定要访问的内存单元为两个字节!
2、个人认为此语句“mov cx byte ptr[bx]”应修改为:“MOV CL,[BX]”、因为题目要求是按单字节来寻找内存单元的,所以用寄存器CL来指定要访问的内存单元
3、你说少填了一个空位。那是因为执行“MOV CL,[BX]”之前要将CX或CA置零,则需要在“MOV CL,[BX]”前面加一条“MOV CX,0”或“MOV CA,0”

我也是初学者,个人拙见!呵呵!
crg007
[第3楼]   [ 回复时间:2009-09-13 12:25 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:4
注册日期:2009-07-29 23:59
1、“mov cx byte ptr[bx]”首先你的语句CX后面少了一个“,”号,其次有寄存器cx参与寻址就不需要byte ptr来指定内存单的长度!因为寄存器cx已指定要访问的内存单元为两个字节!
2、个人认为此语句“mov cx byte ptr[bx]”应修改为:“MOV CL,[BX]”、因为题目要求是按单字节来寻找内存单元的,所以用寄存器CL来指定要访问的内存单元
3、你说少填了一个空位。那是因为执行“MOV CL,[BX]”之前要将CX或CH置零,则需要在“MOV CL,[BX]”前面加一条“MOV CX,0”或“MOV CH,0”

我也是初学者,个人拙见!呵呵!
------------------
回复:不好意思,“CA”应改为“CH ”
feixiang135790
[第4楼]   [ 回复时间:2010-03-20 07:43 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2010-03-05 21:31
jcxz ok指令在mov cx,[bx]之后,就没有必要再在mov cx,[bx]之前把cx清零了吧
ailesargentees
[第5楼]   [ 回复时间:2010-03-22 23:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-02 17:21
貌似可以是:
s: mov cx,[bx];将2000:bx开始的两个字节的数据load到cx中,根据题目要求其中需要判断的字节在al中
   and cx,00ffh;将ah中的数据屏蔽,以便jcxz只判断单个字节是否为零
   inc bx;将取数指针指向2000:bx+1,如果这次不为零,下次判断下一个数据是否为零
   jcxz ok;
f397993401
[第6楼]   [ 回复时间:2010-03-28 12:31 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-03-28 12:08
貌似可以是:
s: mov cx,[bx];将2000:bx开始的两个字节的数据load到cx中,根据题目要求其中需要判断的字节在al中
   and cx,00ffh;将ah中的数据屏蔽,以便jcxz只判断单个字节是否为零
   inc bx;将取数指针指向2000:bx+1,如果这次不为零,下次判断下一个数据是否为零
   jcxz ok;
------------------
回复:我觉得 jcxz 应该放在inc 的前面 其余我和你的一样
f397993401
[第7楼]   [ 回复时间:2010-03-28 12:31 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-03-28 12:08
貌似可以是:
s: mov cx,[bx];将2000:bx开始的两个字节的数据load到cx中,根据题目要求其中需要判断的字节在al中
   and cx,00ffh;将ah中的数据屏蔽,以便jcxz只判断单个字节是否为零
   inc bx;将取数指针指向2000:bx+1,如果这次不为零,下次判断下一个数据是否为零
   jcxz ok;
------------------
回复:我觉得 jcxz 应该放在inc 的前面 其余我和你的一样
kaen007186
[第8楼]   [ 回复时间:2010-05-07 08:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-09-01 06:43
楼上的 INC BX    的位置 应该在 JCXZ OK  下面。否则 MOV DX,[BX]就不对了
     




   应该为
mov ch,0h
mov cl,[bx]        
jcxz ok            如果[BX]地址的内容为0,就跳到 mov dx,[bx]
inc bx             如果不为0,BX+1,跳的上面继续检查下一个字节。
yanchaoxian
[第9楼]   [ 回复时间:2011-04-21 14:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-21 14:02
楼上的都错了,你们是大学生吧?天之骄子????

告诉你们正确答案吧,懒得解释了。       悲剧啊···

mov ch,[bx]
mov cl,0
jcxz ok
inc bx

我的答案才是正确的,而且是简单的,自己琢磨
yanchaoxian
[第10楼]   [ 回复时间:2011-04-21 17:10 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-21 14:02
我搞错了,不好意思,我把下面的jmp看成loop了,哎,不好意思了
看来,mov cl,0可以放在前面,这样一来其实有些同学也是对的
yanchaoxian
[第11楼]   [ 回复时间:2011-04-21 17:11 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-21 14:02
上面的2条都是我写的,千万不要被我第1条误导了,我想删除,但是删除不了,所以大家小心啊
shicong
[第12楼]   [ 回复时间:2011-05-05 10:34 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2011-04-09 19:34
mov ch,0
mov cl,[bx]
jcxz ok

inc bx

正解。
shicong
[第13楼]   [ 回复时间:2011-05-05 10:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2011-04-09 19:34
懒得解释了。
projrh
[第14楼]   [ 回复时间:2011-06-24 14:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-05 12:00
是的
projrh
[第15楼]   [ 回复时间:2011-06-24 14:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-05 12:00
是的
vs9841
[第16楼]   [ 回复时间:2011-06-30 22:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-01-17 12:29
楼上的都错了,你们是大学生吧?天之骄子????

告诉你们正确答案吧,懒得解释了。       悲剧啊···

mov ch,[bx]
mov cl,0
jcxz ok
inc bx

我的答案才是正确的,而且是简单的,自己琢磨
------------------
回复:程序不错,可是看不惯你的口气。似乎你自认为自己IQ不错。
cjlchenjilin
[第17楼]   [ 回复时间:2011-07-01 09:15 ]   [引用]   [回复]   [ top ] 
荣誉值:1
信誉值:0
注册日期:2011-05-30 14:33
hehe..........
lzh22355495
[第18楼]   [ 回复时间:2011-08-06 11:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2010-09-17 02:05
S: mov cx,0
   mov cl,[bx]
   jcxz ok
   inc bx
你们看可以么?
minidxer
[第19楼]   [ 回复时间:2011-09-27 18:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-18 06:18
assume cs:code
code segment
start: mov ax,2000h
mov ds,ax
mov bx,0
s: mov ch,0
mov cl,[bx]
jcxz ok
inc bx
jmp short s
ok: mov dx,bx
mov ax,4c00h
int 21h
code ends
end start

我做的,经调试没有问题
---------------------

mov cx byte ptr[bx] 

这语法上就错了,CX是16位寄存器只能进行字操作

应该改为mov cl,[bx]

CL是8位寄存器可以进行字节操作

在进行数据传送或者运算时,要注意指令的两个操作对象的位数应当是一致的,例如:
mov ax,bx
mov bx,cx
mov ax,18h
mov al,18h
add ax,bx
add ax,20000

等都是正确的指令,而:

mov ax,bl (在8位寄存器和16位寄存器之间传送数据)
mov bh,ax (在16位寄存器和8位寄存器之间传送数据)
mov al,20000  (8位寄存器最大可存放值为255的数据)
add al,100h (将一个高于8位的数据加到一个8位寄存器中)

等都是错误的指令,错误原因都是指令的两个操作对象的位数不一致
xohome
[第20楼]   [ 回复时间:2011-10-06 12:16 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:2
注册日期:2010-11-24 11:04
楼上的都错了,你们是大学生吧?天之骄子????

告诉你们正确答案吧,懒得解释了。       悲剧啊···

mov ch,[bx]
mov cl,0
jcxz ok
inc bx

我的答案才是正确的,而且是简单的,自己琢磨
------------------
回复:错的稀烂,错的离谱。
题目要求第一个值为0的字节,也就说第一位为0的8个位,这点你题目就看错了。不是一个字节全是0,而是第一位为0的字节。
第一位为0,即低位为0,也就说判断的字节必须存储在AL中,jcxz判断的是整体cx,所以必须得清空其它位,则程序应该是这样:
mov cl,[bx]
and cx,0000000000000001B  ;1H,将除第一位外其它位置0
jcxz ok
inc bx
; 不管我描述的是否正确,奉劝一句,能来汇编论坛学习的都是有上进心的人,没必要打击别人来获取那点点的“优越感”
twozs
[第21楼]   [ 回复时间:2011-10-10 23:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-10 23:00
我感觉20楼的兄弟理解有问题,我也认为“第一个值为0的字节”的含义是整个字节的值为0,而不是兄弟说的第一个位为0的字节。
所以:
mov ch,[bx]
mov cl,0
jcxz ok
inc bx 
应为正解。
zgzsjs
[第22楼]   [ 回复时间:2011-12-06 15:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-11-11 20:07
这题可以理解为搜索DS段中的为0的相邻字节
mov cl,[bx] 
mov ch,[bx+1]
jcxz ok 
inc bx 

不知道对不对,debug没问题
zgzsjs
[第23楼]   [ 回复时间:2011-12-06 15:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-11-11 20:07
哦,第二行错了 是mov ch,0
javaimgod
[第24楼]   [ 回复时间:2012-01-25 01:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-01-10 21:29
mov ch,[bx]
mov cl,0
jcxz ok
add bx,1
我的inc bx 和add bx,1一样吧
javaimgod
[第25楼]   [ 回复时间:2012-01-25 01:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-01-10 21:29
inc机器码比add要短
所以+1的情况下要用inc
tomato
[第26楼]   [ 回复时间:2012-01-31 09:49 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
针对这个程序是没问题的,但是,inc和add是有区别的,inc不影响标志位,而add影响标志位。如果需要用到标志位就必须用add.这个在书中后面的章节中会有说明。
8515620
[第27楼]   [ 回复时间:2012-07-12 19:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-05-02 13:26
回复:错的稀烂,错的离谱。
题目要求第一个值为0的字节,也就说第一位为0的8个位,这点你题目就看错了。不是一个字节全是0,而是第一位为0的字节。
第一位为0,即低位为0,也就说判断的字节必须存储在AL中,jcxz判断的是整体cx,所以必须得清空其它位,则程序应该是这样:
mov cl,[bx]
and cx,0000000000000001B  ;1H,将除第一位外其它位置0
jcxz ok
inc bx
; 不管我描述的是否正确,奉劝一句,能来汇编论坛学习的都是有上进心的人,没必要打击别人来获取那点点的“优越感”
------------------
回复:


其实呢,是王爽老师的题目描述得不好,王爽老师的原意是:2000h 段中, 值为0的, 第一个字节
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved