注册 登录
编程论坛 汇编论坛

考试:喜欢汇编的网友可以试试

cnhanxiao 发布于 2008-11-03 12:56, 2400 次点击
第一题:在以下代码上加一条语句,让程序能同时判断出是不是小写字母
  cmp bl,'A'
  jb _Err
  cmp bl,'Z'
  jg _Err

第二题(有些刁钻):用四字节实现下面的代码
   IF ZF=1
      inc eax
   ELSE
       mov al,40h
   ENDIF

答案三天后公布

[bo][un]为避免三天后我忘记,答案已在3楼公布[/un][/bo]

[[it] 本帖最后由 cnhanxiao 于 2008-11-3 15:37 编辑 [/it]]
11 回复
#2
zklhp2008-11-03 13:14
第一个利用大小写的差值 是吗

第二个得用debug……
#3
cnhanxiao2008-11-03 15:29
怕三天后忘记这个考题了,干脆现在就告诉答案:

第一题
  and bl,0DFh   ;强制将小写字母转换为大写,而对大写字母不影响
  cmp bl,'A'
  jb _Err
  cmp bl,'Z'
  jg _Err

第二题
其实就是花指令
  jz $+3
  mov al ,40h
不具有普遍意义。为零时,正好跳转到立即数40h处,而40h正好是inc eax。
2953:0103 7401             JZ      Short 0106
2953:0105 B040             MOV     AL,40h

2953:0106 40               INC     EAX
是四个字节吧?:)

具有普遍意义的至少5字节:
:00401002 7402 jz  00401006
:00401004 B027 mov al,3F
:00401006 40   inc eax
感兴趣的想想为什么。。。

[[it] 本帖最后由 cnhanxiao 于 2008-11-3 15:34 编辑 [/it]]
#4
djxh777102008-11-03 20:56
[bo][un]cnhanxiao[/un] 在 2008-11-3 15:29 的发言:[/bo]

怕三天后忘记这个考题了,干脆现在就告诉答案:

第一题
  and bl,0DFh   ;强制将小写字母转换为大写,而对大写字母不影响
  cmp bl,'A'
  jb _Err
  cmp bl,'Z'
  jg _Err

第二题
其实就是花指令
  jz ...

版主大哥,我今天刚看王爽的书上讲AND 和OR指令时,看到他讲的一个例子,和你的第一题差不多,把小写都转化成大写,但是他说的是二进制的第五位为零则是大写,为一则是小写,而你这里,0DFh 我刚用计算器转了一下是第六位为零,第五位为一,按照王爽那书上讲的应该是and bl 0EFH 而你这里这个0DFH是怎么算来的..谢谢..我这里没弄清楚.麻烦指教一下呀.
#5
zklhp2008-11-03 21:07
[bo][un]djxh77710[/un] 在 2008-11-3 20:56 的发言:[/bo]


版主大哥,我今天刚看王爽的书上讲AND 和OR指令时,看到他讲的一个例子,和你的第一题差不多,把小写都转化成大写,但是他说的是二进制的第五位为零则是大写,为一则是小写,而你这里,0DFh 我刚用计算器转了一下是第六位为 ...


你看看ascii表……
#6
ONEPROBLEM2008-11-03 21:14
LZ,我对第一题的答案有些不解,希望给讲一讲:

 and bl,0DFh   ;强制将小写字母转换为大写,而对大写字母不影响
  cmp bl,'A'
  jb _Err
  cmp bl,'Z'
  jg _Err
============================
对于上面这段代码,假如,在前面安排这样的指令:
mov  bl,41h  或者 mov  bl,61h
最后得到的结果都是41h,那怎么知道之前输入的是41h,还是61h呢?
我觉得,仅加一条指令,还是判断不出一个数值是不是小写的.当然,判断出它是不是字母,那是肯定的.
#7
cnhanxiao2008-11-03 21:30
回复 6# 的帖子
我表达有点问题,其实就是判断输入是不是一个字母,而不管是不是大小写:)
#8
cnhanxiao2008-11-03 21:32
回复 4# 的帖子
5楼已经回复你了,你查查ASCII码表就明白了。
还可以强制转换为小写ASCII码,当然,后面的比较指令就要换成小写字母的区间了。

a=61h=0110 0001b
A=41h=0100 0001b

     0110 0001b   (a)
and  1101 1111b   (0DFh)
=    0100 0001b   (A)

[[it] 本帖最后由 cnhanxiao 于 2008-11-3 21:38 编辑 [/it]]
#9
ONEPROBLEM2008-11-03 21:38
[bo][un]cnhanxiao[/un] 在 2008-11-3 21:30 的发言:[/bo]

我表达有点问题,其实就是判断输入是不是一个字母,而不管是不是大小写:)

谢谢!
#10
zklhp2008-11-03 21:42
这样的活动最好常搞……
#11
djxh777102008-11-03 23:40
[bo][un]zklhp[/un] 在 2008-11-3 21:07 的发言:[/bo]



你看看ascii表……

呵呵,刚才又去把书看了一下,原来是我自己搞错了,是第六位,书是右边数起第一位算是第零位.所以是我自己搞错了.
#12
a120306892008-11-17 16:06
1