【问题标题】:my assembly language program jne not working我的汇编语言程序 jne 不工作
【发布时间】:2026-02-24 19:20:08
【问题描述】:

我想在emu 8086上制作一个汇编语言程序,它有一个dna作为字符串,获取每个序列(20个字符长的子字符串)并检查它是否是回文,如果是,它将以红色打印,如果不是它会以白色打印;它还删除了作为序列分隔符的“-”。 这里我做了一个程序,但我有两个问题:第一个是检查回文的部分,我在 al 和 bl 中都放了两个字符,然后比较它们,如果它们不相等,我停止并跳转到 print_white 函数,问题是即使 al 和 bl 不同,它仍然不会跳转; 我的最后一个问题是:我不知道如何改变颜色,我尝试了多种方法,但它们都不起作用

这是我的代码:

org 100h 
jmp deb
m1:
dna dw 'GCAACCGCCAACGCGTATGA-GCGCGGATGCGCGCGGATGC-TTACGCGTAAAATGCGCATT-CTTCCGCACATCCCGCTACT-GCACGATGGTACCGGTCGCC-CCTGCCATGGTGTGATCCGC-CCGCTACTGCCGTCATCGCC-AAAATAGGCGCCACAGAAAC-GCAGAGGGGAAGGGGAGACG-CGCTCCTTCGGCTTCCTCGC-GTCCGGACCGTGCTGACCCC-AAAATAGGCGCCACAGAAAC-','$' ; this is dna
seq_size = 20 
string_size= $ - m1 
deb: 
lea di, dna
mov si, di
add si, seq_size 
dec si  
mov ah, 9
start: 
cmp [di], 45
jna stop 
cmp [di], 90
ja stop
   mov cx, seq_size  ;here is the palindrome part
   shr cx, 1        
   next_char:
       mov al, [di]
       mov bl, [si]
       cmp al, bl 
       jne print_white  ;here is the jne that is not working for me 
       inc di
       dec si
   loop next_char
   jmp print_red 

print_white :
        mov ax, 10
        sub ax, cx 
        mov cx, 19
        sub di, ax
            printing:
            mov dl, [di]
            mov ah, 2
            int 21h
            inc di 
        loop printing
        mov dl, [di]
        mov ah, 2
        int 21h
        inc di
        inc di
        jmp start

print_red: ;here is the part that i want to use to print the palindromes in red 
        mov ax, 10
        sub ax, cx 
        mov cx, 19
        sub di, ax
            printing2:
            mov dl, [di]
            mov ah, 2
            mov bl, 4 
            mov al, dl
            mov bh, 0
            int 21h
            inc di 
        loop printing2
        mov dl, [di]
        mov ah, 2
        int 21h
        inc di 
        inc di
        jmp start 

stop:
    mov ah,4ch
    int 21h

ret

【问题讨论】:

  • 您使用si 作为地址,它甚至倒计时,所以cmp si, string_size 没有意义。 jne 应该可以工作。

标签: assembly emu8086


【解决方案1】:

注意:为 NASM 编写,因此 EMU8086 可能需要进行一些修改

试试这个大小,注意我是如何改变数据区域的格式的,这样更容易识别每个条目实际上是相同的长度。

    org     0x100

            mov     si, Dna
            mov     cx, Entries

    Next:   lea     di, [si+TxtLen]
            push    di
            push    si

    ; Whenever DI and SI meet, we know it is a palindrome

       .L0: cmp     si, di
            jnz     .J0
            mov     bl, 7           ; Set color white
            jmp     Show

       .J0: dec     di
            lodsb
            cmp     al, [di]
            jz      .L0

    ; Chars did not match, not palindrome

            mov     bl, 4           ; Set color red

     Show:  pop     si              ; Points to beginning of string just evaluated

    ; At this point SI points to string to be printed and BL has the color WHITE or RED.
    ; Implement your printing routine and if need be, POP into a different register if you
    ; have too.        

            pop     si              ; Get pointer to beginning of next string
            loop    Next

            ret
; --------------------------------------------------------------------------
            align 16        ; Aligning makes it easier to see in debug.

    Dna:    db  'GCAACCGCCAACGCGTATGA'

    TxtLen equ  $-Dna

            db  'GCGCGGATGCGCGCGGATGC'
            db  'TTACGCGTAAAATGCGCATT'
            db  'CTTCCGCACATCCCGCTACT'
            db  'GCACGATGGTACCGGTCGCC'
            db  'CCTGCCATGGTGTGATCCGC'
            db  'CCGCTACTGCCGTCATCGCC'
            db  'AAAATAGGCGCCACAGAAAC'
            db  'GCAGAGGGGAAGGGGAGACG'
            db  'CGCTCCTTCGGCTTCCTCGC'
            db  'GTCCGGACCGTGCTGACCCC'
            db  'AAAATAGGCGCCACAGAAAC'

    Entries      equ     ($-Dna) / TxtLen

请注意,我使用的是 DB 而不是 DW。因为汇编器 (NASM) 将其标识为字符串,所以 DW 被忽略了,但不使用正确的 数据类型。

【讨论】: