You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在汇编语言中定位字符并输出其索引(附故障代码)

8086汇编:修复目标字符索引定位与打印问题

我需要在8086汇编中根据索引定位目标字符并输出其索引,但当前代码无法实现该功能,以下是我的代码,请帮忙解决无法打印目标字符索引的问题:

.model small
.stack 100h
.data   

    CR          equ 13d
    LF          equ 10d
    
    intro db CR, LF, "Assemby Language Programming Lab Project $"
    intro1 db CR, LF, "Project Name: Number Hunt $"
    intro2 db CR, LF, "By: Floren Magulod (21-020002) & Shelzy Bareng (21-020035) $"
    line db CR, LF, "------------------------------$"
    
    opt1 db CR, LF, "1.Reverse Array $"
    opt2 db CR, LF, "2.Calculator $"
    opt3 db CR, LF, "3.Hunt the number$" 
    
    prompt db CR, LF, "Choose an option: $"
    
    arr1 db CR, LF, "Enter Array size (0-9): $"
    arr2 db CR, LF, "Enter Elements (0-9): $"
    arr3 db CR, LF, "Reverse form: $" 
    
    cal1 db CR, LF, "Enter 1st number: $"
    cal2 db CR, LF, "Enter 2nd number: $"
    
    choice1 db CR, LF, "1.Addition $"
    choice2 db CR, LF, "2.Subtraction $"
    choice3 db CR, LF, "3.Multiplication $"
    choice4 db CR, LF, "4.Division $"   
    
    res1 db CR, LF, "Result: $"
    
    choice5 db CR, LF, "1.Odd $"
    choice6 db CR, LF, "2.Even $"
    
    input1 db CR, LF, "Sum: $"
    odd db CR, LF, "Odd numbers: $"
    even db CR, LF, "Even numbers: $"  
    
    
    
    find1 db CR, LF, "Enter a character to find: $"
    find2 db CR, LF, "Character is found at index: $"
    find3 db CR, LF, "Character is not found $"
   

    retry db CR, LF, 'Retry [y/n] ? ' ,'$'
    
    choice db 0
    time dw 0
    d db 10 dup(?)
    sum db 0
    num1 db 0
    num2 db 0
    rem db 0  
    char db 10 dup(?)

  
.code
    main proc
        mov ax, @data
        mov ds, ax
        
        mov ah, 09h         
        lea dx, intro
        int 21h
   
        mov ah, 09h         
        lea dx, intro1
        int 21h
      
        mov ah, 09h         
        lea dx, intro2
        int 21h 
        
        mov ah, 09h         
        lea dx, line
        int 21h
        
    start:
        mov ah, 09h         
        lea dx, opt1
        int 21h
        
        mov ah, 09h         
        lea dx, opt2
        int 21h
        
        mov ah, 09h         
        lea dx, opt3
        int 21h
        
        mov ah, 09h         
        lea dx, line
        int 21h
        
        mov ah, 09h         
        lea dx, prompt
        int 21h
        
    while:
        mov ah,1
        int 21h
        sub al,48
        mov choice,al
    
        cmp choice,2
        je calcu
        jl reverse
        jg even_odd
        
        cmp choice, 3
        je hunt
        
    
    calcu:
        mov ah, 09h
        lea dx, cal1
        int 21h
        
        mov ah,1
        int 21h
        sub al,48
        mov num1,al
        
        mov ah, 09h
        lea dx, cal2
        int 21h        
       
        mov ah,1
        int 21h
        sub al,48
        mov num2,al
        
        mov ah, 09h         
        lea dx, line
        int 21h  
 
        mov ah, 09h
        lea dx, choice1
        int 21h 
        
        mov ah, 09h
        lea dx, choice2
        int 21h
        
        mov ah, 09h
        lea dx, choice3
        int 21h
        
        mov ah, 09h
        lea dx, choice4
        int 21h
        
        mov ah, 09h         
        lea dx, line
        int 21h
        
        mov ah, 09h         
        lea dx, prompt
        int 21h
        
        mov ah,1
        int 21h
        sub al,48
        mov choice, al
        
        cmp choice,2
        je subs
        jl addi
        jg multi  
        
        cmp choice,3
        je multi
        jl subs
        jg divi
           
    addi:
        mov al,num1
        add al,num2
    
        mov ah, 09h
        lea dx, res1
        int 21h
    
        mov ah,0
        mov bl,10
        div bl
        mov rem,ah
        
        mov dl,al
        add dl,48
        mov ah,2
        int 21h
        
        mov dl,rem
        add dl,48
        mov ah,2
        int 21h
        jmp again
        
   subs:
        mov ah, 09h
        lea dx, res1
        int 21h
        
        mov al,num1
        sub al,num2
        add al,48
                
    
        mov dl,al
        mov ah,2
        int 21h
        
        jmp again 
    
   
    multi:    
        mov ah, 09h
        lea dx, res1
        int 21h
        
        mov al,num1
        mul num2
    
        mov ah,0
        mov bl,10
        div bl
        mov rem,ah 
        
        
        mov dl,al
        add dl,48
        mov ah,2
        int 21h
        
        mov dl,rem
        add dl,48
        mov ah,2
        int 21h
        jmp again
    
    
    divi: ;;wrong fixed it
        mov ah, 09h
        lea dx, res1
        int 21h
        
        mov ah,0
        mov al,num1
        div num2
        add al,48
    
        mov dl,al
        mov ah,2
        int 21h
        jmp again 
        
 
    reverse:
        mov ah, 09h
        lea dx, line
        int 21h
        
        mov ah, 09h         
        lea dx, arr1
        int 21h
        
        mov ah,1
        int 21h
        sub al,48
        mov ah,0
        mov time,ax
       
        mov ah, 09h
        lea dx, arr2
        int 21h 
        
        mov cx,time
        mov bx,0
    
    val_store:
    
        mov ah,1
        int 21h
        sub al,48
        mov d[bx],al
        push ax
        add sum,al
        inc bx
        loop val_store
    
        mov ah, 09h
        lea dx, arr3
        int 21h
    
        mov cx,time
          
    
    rev:
        pop dx
        add dl,48
        mov ah,2
        int 21h
        
        loop rev
        jmp again
        
    even_odd:
        mov ah, 09h
        lea dx, line
        int 21h
        
        mov ah, 09h         
        lea dx, arr1
        int 21h   
       
        mov ah,1
        int 21h
        sub al,48
        mov ah,0
        mov time,ax 
        
        mov ah, 09h
        lea dx, arr2
        int 21h
               
        mov cx,time
        mov bx,0
   

    value_store:
    
        mov ah,1
        int 21h
        sub al,48
        mov d[bx],al
        push ax
        add sum,al
        inc bx
        loop value_store
        
        mov cx,time
        
        mov ah, 09h
        lea dx, choice5
        int 21h
        
        mov ah, 09h
        lea dx, choice6
        int 21h
        
        mov ah, 09h         
        lea dx, line
        int 21h
        
        mov ah, 09h         
        lea dx, prompt
        int 21h
        
        mov ah,1
        int 21h
        sub al,48
       
        cmp al, 1
        je odd_num
        jmp even1
        
        
          
            
    odd_num:
    
        mov ah, 09h
        lea dx, odd
        int 21h
        mov cx, time
        mov bx, 0
    print_odd:
        mov al, d[bx]
        test al, 1
        jz skip_odd
        mov dl, al
        add dl, 48
        mov ah, 2
        int 21h
        mov dl, ' '
        int 21h
    skip_odd:
        inc bx
        loop print_odd
        jmp again
    
    even1:
        mov ah, 09h
        lea dx, even
        int 21h
        mov cx, time
        mov bx, 0
    print_even:
        mov al, d[bx]
        test al, 1
        jnz skip_even
        mov dl, al
        add dl, 48
        mov ah, 2
        int 21h
        mov dl, ' '
        int 21h
    skip_even:
        inc bx
        loop print_even
        jmp hunt
    
    
    summ:
        
    hunt:
        
        mov ah, 09h
        lea dx, find1
        int 21h
        
        mov ah, 1
        int 21h
        sub al, 48  ; 转换为数字值
        mov char, al ; 保存目标字符
        
        mov cx, time ; 数组长度作为循环次数
        mov si, 0    ; 索引从0开始
        lea bx, d    ; 数组首地址
    
    l2:
        cmp [bx+si], al ; 对比当前元素和目标字符
        je PrintFound
    
        inc si         ; 索引递增
        loop l2        ; 循环直到遍历完数组
    
    ; 遍历完未找到,执行未找到逻辑
    NotFound:
        lea dx, find3
        mov ah, 9
        int 21h
        jmp again
    
    PrintFound:
        lea dx, find2
        mov ah, 9
        int 21h
        
        ; 将索引si转换为ASCII并打印
        mov al, si
        add al, 48
        mov dl, al
        mov ah, 2
        int 21h
    
        jmp again
        
    
 
    again:
        mov ah, 09h
        lea dx, line
        int 21h 
        
        mov ah, 09h
        lea dx, retry
        int 21h
        
        mov ah, 1h
        int 21h
        
        cmp al, 'n'
        je stop
        
        cmp al, 'y'
        je start
        
        jmp again
    
    stop:
        mov ax, 4c00h
        int 21h
main endp
end main

关键修复点说明

  1. 保存目标字符:获取用户输入后,将其转换为数字值并存入char变量,避免后续逻辑覆盖输入值
  2. 正确的索引跟踪:使用si寄存器从0开始计数,每次循环递增,准确记录当前元素的索引
  3. 合理的循环终止条件:用数组长度time作为循环次数,确保遍历整个数组的所有元素
  4. 索引打印逻辑:找到匹配时,将si中的索引值转换为ASCII码直接打印,正确输出索引位置
  5. 修复分支跳转:原代码中even_odd的分支判断错误,修改为正确的数字对比;同时补全了奇数/偶数的打印逻辑,让程序功能更完整

内容的提问来源于stack exchange,提问作者Erolle Magulod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:02:08