如何修改冒泡排序代码以在程序集8086中显示十进制数的结果

时间:2016-01-31 01:47:24

标签: assembly hex decimal x86-16 bubble-sort

所以,我有这个教授给出的代码,当你执行它时,它会对数组中的数字进行排序。显示屏将显示为十六进制。我要求修改此代码,以便它们显示为小数。试过一些子程序,我在互联网上找到但仍然没有。我使用的程序叫做masm,它运行在dosbox上。

.486                

DISP MACRO X

    push ax
    push dx
    mov ah,09h
    mov dx,offset X
    int 21h
    pop dx
    pop ax

ENDM

STACK_SEG segment para STACK    

    db 256 dup (0)

STACK_SEG ends


DATA_SEG segment  para public   

     array dw 9,18,118,6,325,4,-9,2,1

     array_str equ (($-array)/2)

    ;arr_sz db 255
    ;array_str db 1 dup(0)
    ;array dw 100 dup(0)

     in_mes db 'Insert number'
        db '$'

     buffer db 4 dup(0)
        db '$'
     mes db 10,13
        db '$'
     swap_count db 1 dup(1)
DATA_SEG ends


CODE_SEG segment USE16 para public 'CODE'   

    assume cs:code_seg,ds:data_seg


START:              

main proc far       

    ; Set up stack for return

    push ds
    mov ax,0
    push ax

    ; Set DS register to current data segment

    mov ax,data_seg
    mov ds ,ax          




    disp mes
    call disp_arr
    disp mes
    disp mes




next_pass:
    mov al,swap_count
    cmp al,0
    je done
    mov swap_count,0
    mov di,0
next_elm:
    shl di,1
    mov ax, array[di]
    cmp ax, array[di+2]
    jg swap
increment:
    shr di,1
    inc di
    mov al, array_str
    and ax,0Fh
    cmp di, ax
    je next_pass
    jmp next_elm
swap:
    inc swap_count
    mov bx,array[di+2]
    mov array[di+2],ax
    mov array[di],bx
    jmp increment
done:


    call disp_arr
    disp mes
    disp mes
    ret             

main endp           

HEX2ASCII PROC NEAR



    push    bp
    mov     bp,sp
    mov     ax,[bp+4]   

    push    cx

    mov     cx,4
    mov     bp,cx

 H2A1:

    push    ax
    and     al,0Fh     
    add     al,30h
    cmp     al,'9'
    jbe     H2A2
    add     al,7h

 H2A2:

    dec     cx
    mov     bp,cx
    mov buffer[bp],al

    pop     ax
    ror     ax,4        
    jnz     H2A1

    pop     cx
    pop     bp

    ret 2

HEX2ASCII ENDP

disp_arr PROC NEAR


    push di
    mov di,0
lp1:
    push di
    shl di,1
    mov ax, array[di]
    push ax
    call HEX2ASCII
    disp buffer
    disp mes
    pop di
    inc di
    mov al, array_str
    and ax,0fh
    cmp di, ax
    jb lp1
    pop di


    ret

disp_arr ENDP

CODE_SEG ends       

END START

1 个答案:

答案 0 :(得分:1)

甚至在尝试更改此程序以使其显示小数而不是十六进制之前,有几个问题:

  • HEX2ASCII 程序使用mov buffer[bp],al,其中缓冲区位于DS可寻址 DATA_SEG 中但使用{ {1}}意味着将使用SS段寄存器!请插入BP段覆盖前缀或使用其他注册表DS:(请记住BX / push)。

  • disp 宏用于显示缓冲区内容时,它会从此缓冲区的第1个字节开始,但是由于采用的早期退出方法HEX2ASCII 程序第1,第2和第3个字节可以/将包含垃圾!

这是 HEX2ASCII 的一个版本,不需要更改 disp 的工作方式。它不会预先退出,因此您可以安全地为每个数字显示4位数字。

pop

在转换为十六进制时,HEX2ASCII PROC NEAR push bp mov bp,sp mov ax,[bp+4] push bx mov bx,4 H2A1: push ax and al,0Fh add al,30h cmp al,'9' jbe H2A2 add al,7h H2A2: dec bx mov buffer[bx],al pop ax ror ax,4 test bx,bx jnz H2A1 pop bx pop bp ret 2 and al,0Fh指令起着关键作用。他们(有点)通过 16 进行划分 在转换为小数时,您需要按 10 进行除法。您必须使用ror ax,4指令,将余数转换为以前的文本,并使用商继续算法。