+ -
当前位置:首页 → 问答吧 → 写了一个字符串比较的小程序,结果发现无论如何都输出2,为什么?

写了一个字符串比较的小程序,结果发现无论如何都输出2,为什么?

时间:2010-12-30

来源:互联网

code segment
  assume cs:code
  org 100h
  db 'hbha$';我改成aaaa,或者kkkk,结果竟然都还是输出"2"
  db 'hche$'
start:
  mov si,100h
  mov di,105h
  mov ax,0h
  mov ds,ax
  mov es,ax
  mov cl,4h
  rep cmpsb
  jl printl
  jg printg
printe:
  mov ah,2h
  mov dl,31h;输出1
  int 21h
  jmp return
printl:
  mov ah,2h
  mov dl,32h;输出2
  int 21h
  jmp return
printg:
  mov ah,2h
  mov dl,33h;输出3
  int 21h
return:
  mov ah,4ch
  int 21h
code ends
end start

----------------------

我的代码到底错在哪里?

作者: asdf12312y   发布时间: 2010-12-30

修改以后, 你再试一试,注意注释部分
Assembly code

code segment
  assume cs:code,ds:code,es:code ;貌似必须的
  org 100h
  db 'hdha$'
  db 'hdda$'
start:
  mov si,100h
  mov di,105h
  mov ax,cs     ;这个也必须
  mov ds,ax
  mov es,ax
  mov cx,4h
   cld          ;这个事必须的
  repz cmpsb    ;rep要加Z
  jl printl
  jg printg
printe:
  mov ah,2h
  mov dl,31h
  int 21h
  jmp return
printl:
  mov ah,2h
  mov dl,32h
  int 21h
  jmp return
printg:
  mov ah,2h
  mov dl,33h
  int 21h
return:
  mov ah,4ch
  int 21h
code ends
end start

作者: masmaster   发布时间: 2010-12-30

楼上已指出了你的主要错误,我再补充一下。

code segment
  assume cs:code
  org 100h
jmp start 看你的程序结构应该是希望写成.com程序, 如果是这样, 偏移地址100H处必须是可执行指令(它是入口地址), 加这句转到真正的入口处. 如果这样就不用给ds赋值了, 且最后的end入口地址也不能是start了. 

  mov cl,4h 循环次数要用cx控制


  rep cmpsb rep 是无条件重复4次, 所以前3次比较都白做.


  jl printl 这里用的是最后那次比较的结果
  jg printg

作者: shzhfu   发布时间: 2010-12-31