【问题标题】:How to modify bubble sort code to show results in decimal number in assembly 8086如何修改冒泡排序代码以在程序集 8086 中以十进制数字显示结果
【发布时间】:2016-01-31 01:47:23
【问题描述】:

所以,我有教授给出的这段代码,当你执行它时,它会对数组中的数字进行排序。显示屏会将它们显示为十六进制。我被要求修改此代码,以便它们显示为小数。尝试了一些子程序,我在网上找到了,但仍然没有。我正在使用的程序叫做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

【问题讨论】:

  • “尝试了一些子程序,我在网上找到了,但仍然没有。” 这很模糊,并没有真正告诉我们任何有用的东西。无论如何,关于如何在 x86 汇编中将整数转换为字符串的问题之前已经被问过很多次了。做一些搜索。
  • 哇.. 你的导师对你很轻松。您需要做的就是使用他的HEX2ASCII 例程作为示例,并编写一些将十六进制数字转换为十进制的内容。

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


【解决方案1】:

即使在尝试更改此程序以显示十进制而不是十六进制之前,也存在几个问题:

  • HEX2ASCII 过程使用mov buffer[bp],al 和位于DS 可寻址DATA_SEG 中的缓冲区,但使用BP意味着将使用 SS 段寄存器!要么插入一个DS: 段覆盖前缀,要么使用另一个寄存器,如BX(记住push/pop 它)。

  • disp 宏用于显示缓冲区内容时,它从该缓冲区的第一个字节开始显示,但由于 采用了提前退出方法HEX2ASCII 程序的第一个、第二个和第三个字节可以/将包含垃圾!

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

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,0Fhror ax,4 指令起着关键作用。他们(有点)按16进行除法。
在转换为十进制时,您需要除以 10。您必须使用 div 指令,像以前一样将余数转换为文本,然后使用商继续算法。

【讨论】:

    猜你喜欢
    • 2013-04-30
    • 2018-05-09
    • 1970-01-01
    • 2018-06-30
    • 2013-04-22
    • 2012-03-25
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多