Assembly Keil:将ASCII数转换为BCD和十六进制的汇编程序

Assembly Keil:将ASCII数转换为BCD和十六进制的汇编程序,assembly,keil,Assembly,Keil,这个Keil uVision程序应该加载一个正整数ASCII数(例如1234)。程序应将其转换为寄存器R1中的BCD编码数,以及寄存器2中的十六进制数。。。 有人能给我解释一下下面的功能吗? 特别是: MOV R4,#10 及 ??? 节目如下: LDR R0, =Wert ; Pointer laden LDR R1,[R0] BL KONVERT ; Unterprogramm KONVERT aufrufen endlos B end

这个Keil uVision程序应该加载一个正整数ASCII数(例如1234)。程序应将其转换为寄存器R1中的BCD编码数,以及寄存器2中的十六进制数。。。 有人能给我解释一下下面的功能吗? 特别是:

MOV     R4,#10

??? 节目如下:

LDR R0, =Wert ; Pointer laden
    LDR R1,[R0]
    BL KONVERT ; Unterprogramm KONVERT aufrufen
endlos         B        endlos


KONVERT
    LDRB    R3,[R0],#1 ; Byte laden
    AND     R1,R3,#0xF ; ASCII-HEX-Wandlung
    MOV     R2,R1 ; HEX-Zahl
    MOV     R4,#10

    LDRB    R3,[R0],#1 ; nächstes laden
    AND     R3,R3,#0xF ; ASCII-Hex-Wandlung
    ORR     R1,R3,R1,LSL #4 ; BCD-Wert bilden
    MLA     R2,R4,R2,R3 ; HEX-Zahl

    LDRB    R3,[R0],#1 ; nächstes laden
    AND     R3,R3,#0xF ; ASCII-Hex-Wandlung
    ORR     R1,R3,R1,LSL #4 ; BCD-Wert bilden
    MLA     R2,R4,R2,R3 ; HEX-Zahl

    LDRB    R3,[R0],#1 ; nächstes laden
    AND     R3,R3,#0xF ; ASCII-Hex-Wandlung
    ORR     R1,R3,R1,LSL #4 ; BCD-Wert bilden
    MLA     R2,R4,R2,R3 ; HEX-Zahl

    BX      LR ; Rücksprung

这是此类问题的一个很好的起点。

我没有很好的文档记录,那么问题出在哪里?如果你不懂德语,可能会很有用。MOV R4,#10没有文档记录,谢谢你没有帮助。将常量10加载到R4有什么用呢?它用于在r2中构建十六进制数(hex Zahl)。例如,您有一个类似1234的字符串,即“壹仟贰佰叁拾四”。从最高有效位开始读取,将其乘以10,然后将下一位数字相加,再乘以10,依此类推。((((((((1*10)+2)*10)+3)*10)+4=1234)
LDR R0, =Wert ; Pointer laden
    LDR R1,[R0]
    BL KONVERT ; Unterprogramm KONVERT aufrufen
endlos         B        endlos


KONVERT
    LDRB    R3,[R0],#1 ; Byte laden
    AND     R1,R3,#0xF ; ASCII-HEX-Wandlung
    MOV     R2,R1 ; HEX-Zahl
    MOV     R4,#10

    LDRB    R3,[R0],#1 ; nächstes laden
    AND     R3,R3,#0xF ; ASCII-Hex-Wandlung
    ORR     R1,R3,R1,LSL #4 ; BCD-Wert bilden
    MLA     R2,R4,R2,R3 ; HEX-Zahl

    LDRB    R3,[R0],#1 ; nächstes laden
    AND     R3,R3,#0xF ; ASCII-Hex-Wandlung
    ORR     R1,R3,R1,LSL #4 ; BCD-Wert bilden
    MLA     R2,R4,R2,R3 ; HEX-Zahl

    LDRB    R3,[R0],#1 ; nächstes laden
    AND     R3,R3,#0xF ; ASCII-Hex-Wandlung
    ORR     R1,R3,R1,LSL #4 ; BCD-Wert bilden
    MLA     R2,R4,R2,R3 ; HEX-Zahl

    BX      LR ; Rücksprung
MOV     R4,#10
; loads constant 10 decimal into R4

AND     R1,R3,#0xF
; 0x0F & R3 are stored in R1 (AND operation). This is used to remove the 0x30 offset of the numbers 0-9 in ASCII

MLA     R2,R4,R2,R3
; (R2 * R4) + R3 are stored in R2 (Multiply-Accumulate operation)