简体   繁体   English

6502 汇编二进制到 bcd - 在 x86 上可能吗?

[英]6502 assembly binary to bcd - is that possible on x86?

I have a few questions regarding this code:关于这段代码,我有几个问题:

; Convert an 16 bit binary value to BCD
;
; This function converts a 16 bit binary value into a 24 bit BCD. It
; works by transferring one bit a time from the source and adding it
; into a BCD value that is being doubled on each iteration. As all the
; arithmetic is being done in BCD the result is a binary to decimal
; conversion. All conversions take 915 clock cycles.
;
; See BINBCD8 for more details of its operation.
;
; Andrew Jacobs, 28-Feb-2004

        .ORG $0200

BINBCD16:   SED     ; Switch to decimal mode
        LDA #0      ; Ensure the result is clear
        STA BCD+0
        STA BCD+1
        STA BCD+2
        LDX #16     ; The number of source bits

CNVBIT:     ASL BIN+0   ; Shift out one bit
        ROL BIN+1
        LDA BCD+0   ; And add into result
        ADC BCD+0
        STA BCD+0
        LDA BCD+1   ; propagating any carry
        ADC BCD+1
        STA BCD+1
        LDA BCD+2   ; ... thru whole result
        ADC BCD+2
        STA BCD+2
        DEX     ; And repeat for next bit
        BNE CNVBIT
        CLD     ; Back to binary

        BRK     ; All Done.

; A test value to be converted

        .ORG $0300

BIN     .DW  12345
BCD     .DS  3

from this site.这个网站。

I don't understand what exactly this line does:我不明白这条线到底是做什么的:

ROL BIN+1

Does it perform right shift on the second byte of BIN?它是否对 BIN 的第二个字节执行右移? If so, what exactly is in this byte?如果是这样,这个字节到底是什么?

Also is it possible to write something similar for x86?也可以为 x86 写类似的东西吗? Is it possible to use BCD in order to print number in decimal with x86 in some elegant way?是否可以使用 BCD 以某种优雅的方式使用 x86 打印十进制数字? Or better stick with division by 10?还是最好坚持除以 10? I know something about AAA, AAM instructions but I don't know if they're really useful.我对 AAA、AAM 指令有所了解,但我不知道它们是否真的有用。

ROL = rotate left. ROL = 向左旋转。 Yes, that is the second byte.是的,这是第二个字节。 The ASL + ROL together shift the 16 bit number in BIN and BIN+1 left by one bit. ASL + ROL一起将BINBIN+1中的 16 位数字左移一位。 The ROL is used to propagate the MSB of the low byte into the LSB of the high byte while the MSB of the high byte is moved to the carry flag which is used by the ADC instruction. ROL用于将低字节的 MSB 传播到高字节的 LSB,同时将高字节的 MSB 移动到ADC指令使用的进位标志。

Note this code uses packed BCD, so on x86 you'd need to use the DAA not the AAA instruction.请注意,此代码使用压缩 BCD,因此在 x86 上,您需要使用 DAA 而不是 AAA 指令。 Also BCD stuff has been deprecated and are not available in 64 bit mode.此外,BCD 内容已被弃用,并且在 64 位模式下不可用。 Nevertheless, here is equivalent x86 code, with added text conversion and printing.尽管如此,这里是等效的 x86 代码,添加了文本转换和打印。 GNU assembler at&t, 32 bit linux: GNU 汇编器 at&t,32 位 linux:

.globl main
main:
    sub $8, %esp
    mov $12345, %edx
    mov $16, %ecx
repeat:
    shl %dx
    mov bcd, %al
    adc %al, %al
    daa
    mov %al, bcd
    mov bcd+1, %al
    adc %al, %al
    daa
    mov %al, bcd+1
    mov bcd+2, %al
    adc %al, %al
    daa
    mov %al, bcd+2
    dec %ecx
    jnz repeat

# print
    lea bcd+2, %esi
    lea txt, %edi
    call unpack
    call unpack
    call unpack
    push $txt
    call puts
    call exit

unpack:
    mov (%esi), %al
    dec %esi
    mov %al, %ah
    shr $4, %al
    and $15, %ah
    add $0x3030, %ax
    stosw
    ret

.lcomm bcd, 3
.lcomm txt, 7

The above is not the recommended way to do generic int-to-string, it's just translation of the 6502 code in the question.以上不是执行通用 int 到字符串的推荐方法,它只是问题中 6502 代码的翻译。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM