如何在汇编语言中定位字符并输出其索引(附故障代码)
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
关键修复点说明
- 保存目标字符:获取用户输入后,将其转换为数字值并存入
char变量,避免后续逻辑覆盖输入值 - 正确的索引跟踪:使用
si寄存器从0开始计数,每次循环递增,准确记录当前元素的索引 - 合理的循环终止条件:用数组长度
time作为循环次数,确保遍历整个数组的所有元素 - 索引打印逻辑:找到匹配时,将
si中的索引值转换为ASCII码直接打印,正确输出索引位置 - 修复分支跳转:原代码中
even_odd的分支判断错误,修改为正确的数字对比;同时补全了奇数/偶数的打印逻辑,让程序功能更完整
内容的提问来源于stack exchange,提问作者Erolle Magulod
相关产品推荐
相关产品推荐

