【问题标题】:TASM string to hexadecimal numberTASM 字符串转十六进制数
【发布时间】:2013-12-04 18:53:21
【问题描述】:

我对基于 TASM 的汇编代码有疑问。我想将“字符串”指针中的字符串转换为十进制数,然后将其打印为十六进制数。但是,该代码仅正确打印右侧的前 2 个字符。这可能有什么问题?

concd   SEGMENT
        ASSUME cs: concd
        ORG 100h

main:   
    mov ax, 0
    mov bx, offset string
    mov cx, 0
    mov dx, 0       
    mov si, 0       

jump:   
    mov cx, [bx + si]
    cmp cx, 0h          ;checking if we reached the end of the string
    jz exit

    mov dx, ax
    mov cx, 9

mult:   
    add ax, dx          ;loop for multiplying by 10 
    loop mult

    mov cx, [bx + si]
    sub cx, 30h
    add ax, cx      

    inc si      
    jmp jump

exit:   
    call hex
    mov ah, 04Ch
    mov al, 0
    int 21h

hex PROC
    mov dx, ax
    mov cl, 12
jump2: 
    mov ax, dx
    shr ax, cl
    and ax, 15
    cmp ax, 9
    jng t
    add ax, 7h
t:  add ax, 30h
    call putc
    sub cl, 4
    jnc jump2

    RET
hex ENDP

putc PROC

    mov ah, 0Eh
    int 10h

    RET
putc ENDP

string  DB  "1234", 0h

concd   ENDS
    END     main

【问题讨论】:

  • 您是否验证过它正在正确地将字符串转换为十进制数?
  • 你知道8086有mulimul指令来执行乘法吗?不需要add的循环
  • "mul" 将AX寄存器相乘的结果存储在DX和AX(32位)中,相当不方便。
  • “这很不方便” 怎么回事?无论如何,您似乎只使用了低 16 位。
  • 如果 AXmul cx 将导致 dx=0 且 ax *= 10。

标签: string assembly converter tasm


【解决方案1】:

我做了一些小改动,现在可以了。 我用“阶段 1”评论了它实际上确实让一个字符 abd 做了一些事情的变化,而“阶段 2”则是纠正了转换的变化。

现在是 OP 找出问题所在的时候了。

concd   SEGMENT
        ASSUME cs: concd
        ORG 100h

main:   
    mov ax, cs ;; added - phase 1
    mov ds, ax ;; added - phase 1
    mov ax, 0
    mov bx, offset string
    mov cx, 0
    mov dx, 0       
    mov si, 0       

jump:   
    mov ch, 0  ;; Added - phase 2
    mov cl, [bx + si] ;; added - phase 2
    ;mov cx, [bx + si] ;; removed - phase 2
    cmp cx, 0h          ;checking if we reached the end of the string
    jz exit

    mov dx, ax
    mov cx, 9

mult: ; ax contains the number
    ;; removed the next 2 lines - phase 2
    ;add ax, dx          ;loop for multiplying by 10 
    ;loop mult
    ;; added the next 2 lines - phase 2
    mov cl, 10
    mul cl          ; multiply by 10

    mov cx, [bx + si]
    sub cx, 30h
    add ax, cx      

    inc si      
    jmp jump

exit:   
    call hex
    mov ah, 04Ch
    mov al, 0
    int 21h

hex PROC
    mov dx, ax
    mov cl, 12
jump2: 
    mov ax, dx
    shr ax, cl
    and ax, 15
    cmp ax, 9
    jng t
    add ax, 7h
t:  add ax, 30h
    call putc
    sub cl, 4
    jnc jump2

    RET
hex ENDP

putc PROC

    mov ah, 0Eh
    int 10h

    RET
putc ENDP

string  DB  "1234", 0h

concd   ENDS
    END     main

【讨论】:

    猜你喜欢
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 2018-01-31
    • 2012-08-15
    • 2017-03-22
    • 2014-03-19
    相关资源
    最近更新 更多