所以,我有这个教授给出的代码,当你执行它时,它会对数组中的数字进行排序。显示屏将显示为十六进制。我要求修改此代码,以便它们显示为小数。试过一些子程序,我在互联网上找到但仍然没有。我使用的程序叫做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
答案 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
指令,将余数转换为以前的文本,并使用商继续算法。