【问题标题】:How to print integer, instead ascii value? [duplicate]如何打印整数,而不是 ascii 值? [复制]
【发布时间】:2020-01-30 10:44:01
【问题描述】:

我想在循环中添加五个数字并打印该总和。这是我的代码。

format MZ
stack sth:256
entry codeseg: main

segment sdat use16
;ds segment x
tabl db 1,2,3,4,10


segment sth use16
db 256 dup (?)

segment codeseg use16

main:
mov ax, sdat
mov ds, ax

;mov ax, sth
;mov ss, ax
;mov sp, 256

xor ax,ax
mov bx,tabl
mov cx,5
add:
        add ax,[bx]
        inc bx
        loop add

mov dx, ax
mov ah, 02h
int 21h


mov ax, 4c00h
int 21h
ret

我不知道自己做错了什么,我想打印总和,而不是 ascii 的值。

【问题讨论】:

    标签: assembly dos x86-16 fasm


    【解决方案1】:

    您必须将 AX 寄存器的内容转换为操作系统可以显示的 ASCII 字符串。除其他更改外,我已相应地更新了您的代码。现在你的挑战是弄清楚这一切;-)

    format MZ
    stack 256
    entry codeseg:main
    
    segment dataseg use16
    tabl db 1,2,3,4,10
    outstr db 8 dup ('$')
    
    segment codeseg use16
    
    main:
    mov ax, dataseg
    mov ds, ax
    mov es, ax
    
    xor ax,ax
    mov bx,tabl
    mov cx,5
    addd:
        add al,[bx]
        adc ah, 0
        inc bx
        loop addd
    
    lea di, [outstr]
    call ax2dec
    
    lea dx, [outstr]
    mov ah, 09h
    int 21h
    
    mov ax, 4c00h
    int 21h
    
    ax2dec:                                 ; Args: AX:number ES:DI: pointer to string
        mov bx, 10                          ; Base 10 -> divisor
        xor cx, cx                          ; CX=0 (number of digits)
      Loop_1:
        xor dx, dx                          ; Clear DX for division
        div bx                              ; AX = DX:AX / BX   Remainder DX
        push dx                             ; Push remainder for LIFO in Loop_2
        inc cx                              ; inc cl = 2 bytes, inc cx = 1 byte
        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 BYTE [es:di], '$'               ; Termination character for 'int 21h fn 09h'
        ret
    

    【讨论】:

    • 效果很好,但我还有一个问题。是否有可能立即(在循环中)从数组中添加值,而不进行从 ascii 到整数的转换?
    • @Paweł。对不起,但我不明白这个问题。没有从 ASCII 到整数的转换。汇编器已将tabl 存储为整数。如果您不想拆分加法(ADD 和 ADC),请将 table 声明为 WORD 数组(DW 而不是 DB)。然后您可以“立即”添加值(您的意思是那个?)ADD AX,[BX]
    • @Pawel: ...您必须将inc bx 更改为add bx,2,因为[bx] 需要一个地址(按字节),而不是索引..
    猜你喜欢
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2020-01-03
    • 2021-09-26
    • 2022-11-22
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多