[英]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
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
一起将BIN
和BIN+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.