gpt4 book ai didi

assembly - 汇编程序在屏幕上打印数字

转载 作者:行者123 更新时间:2023-12-01 23:49:48 25 4
gpt4 key购买 nike

如何在屏幕上打印数组的数字(不是 ASCII 符号)?

MODEL SMALL
STACK 256
DATASEG
Data1 dw 4h, -23h, 3h, 276h, -79h, -345h, 6h, 44h, -77h, 111, 12,10, '$'
CODESEG
Start:
mov ax,@data
mov ds,ax
mov dx,offset Data1
mov ah,09h
int 21h

Exit:
mov ah,04Ch
mov al,0h
int 21h

End Start

此代码打印与数组中的数字对应的 ASCII 符号。我要打印数字

最佳答案

我假设您想要获得带符号的数字并且您知道负数是如何编码的(请参阅 Wikipedia's article of Ones' complement 。MSDOS 没有提供将数据转换为数字的现成函数,因此您必须创建这样的函数自己动手,主要问题是重复除以10和余数处理,网上有很多例子和解释,谷歌搜索:“assembly convert to decimal”。

这是我的方法 (TASM):

LOCALS @@

MODEL SMALL
STACK 256
DATASEG
Data1 dw 4h, -23h, 3h, 276h, -79h, -345h, 6h, 44h, -77h, 111, 12,10, '$'
Decimal db 8 DUP ('$')
CODESEG

main PROC
mov ax, @data
mov ds, ax
mov es, ax

mov si, OFFSET Data1

Loop:

mov di, OFFSET Decimal ; Convert WORD to decimal string
mov ax, [si]
call ax2dec_signed

push si ; store SI for later use

mov dx, OFFSET Decimal ; Print the number
mov ah,09h
int 21h

mov ah, 02h ; Print a space
mov dl, 20h
int 21h

pop si ; restore SI
add si, 2 ; next WORD
cmp word ptr [si], '$' ; End of String?
jne Loop ; No: once more

Exit:
mov ah,04Ch
mov al,0h
int 21h
main ENDP

ax2dec_signed PROC ; Args: AX register to convert, ES:DI pointer to target string
test ax, ax ; AX negative?
jns @@J1 ; No: skip the following code
mov byte ptr [di], '-' ; Yes: store the negative sign
inc di ; Increment the pointer to the target string
neg ax ; One's complement, i.e. AX = ABS(AX)
@@J1:
mov bx, 10 ; Base 10 -> divisor
xor cx, cx ; CX=0 (number of digits)
@@Loop_1:
xor dx, dx ; Clear DX for division (don't forget it!)
div bx ; AX = DX:AX / BX Remainder DX
push dx ; Push remainder for LIFO in Loop_2
add cl, 1 ; Equivalent to 'inc cl'
test ax, ax ; AX = 0?
jnz @@Loop_1 ; No: once more
@@Loop_2:
pop ax ; Get back pushed digits
or al, 00110000b ; Conversion to ASCII
stosb ; Store only AL to [ES:DI] (DI is a pointer to a string)
loop @@Loop_2 ; Until there are no digits left
mov [di], '$' ; Store termination character for 'int 21h fn 09h'
ret ; Ret: target string contains decimal '$'-terminated ASCII-String
ax2dec_signed ENDP

END main

关于assembly - 汇编程序在屏幕上打印数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27088848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com