【发布时间】: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