assembly 程序集中的阅读行

vohkndzv  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(126)

我需要在汇编语言中创建一个程序,可以计算一行中的字符数,并将最短的字符长度保存保存到一个变量中。但我真的不知道该怎么做,也找不到任何帮助。
我有这个,但它远不是我想要的。

cpu 8086
segment code
start   mov bx,data
mov ds,bx
mov bx,stack
mov ss,bx
mov sp,dno

radek   mov ah,0x0a
mov dx,nacteno
    int 21h
mov al,[nacteno+1]
cmp al,0
jne size
jz konec

size    mov bl,[rslt34]
cmp al,bl
jle radek
mov [rslt34],al
jmp radek
konec   hlt

segment data
nacteno db 255, ?
resb 255
rslt34  db 0

segment stack
resb 16
dno:    db ?

字符串

vs3odd8k

vs3odd8k1#

可以在一行中计数个字符
因为你使用的是DOS.BufferedInput function 0Ah,所以不需要太多的计数,因为你可以在结构的第二个字节中免费获得它。
也许令人惊讶的是,你的尝试相当不错。但是由于你初始化 * rslt 34 *(rslt34 db 0)的方式,cmp al,bljle radek不会接近最短的字符串,而是接近最长的字符串。
你应该把 * rslt 34 * 设置为255,然后使用下面的代码:

cmp  al, 0          ; Exit on empty string
  je   konec
size:
  cmp  al, [rslt34]
  jnb  radek          ; Ignore if not below what we already have
  mov  [rslt34], al   ; Update with a length that is smaller than before
  jmp  radek
konec:

字符串
DOS给你的长度字节必须被当作一个unsigned数字。因此不要使用像jle和朋友一样的有符号条件跳转。使用像jb(JumpIfBelow),jnb(JumpIfNotBelow)等无符号条件跳转。

segment stack
resb 16


实际上,BIOS/DOS堆栈至少应该是256字节,最好是512字节。

konec   hlt


退出DOS程序的常用方法是使用以下指令:

mov  ax, 4C00h    ; DOS.TerminateProgram
int  21h

相关问题