宏打印存储在一个字节中的值。装配masm

时间:2017-03-24 07:06:15

标签: assembly macros masm

汇编,masm

嘿,我写了一个宏来打印存储在dane1段中的1字节值。

我将值除以16,然后我将提醒叠加到值== 0。然后我弹出提醒将它们转换为ASCII码,并打印出来。

有人看我的代码吗?我应该改变什么以使其更简单?

我不想每次都这样做:

List<string> lstnew = matches.Cast<Match>().Select(x => x.Groups[1].Value).ToList();

是否可以修改此宏,以便它可以使用它:

mov dl,67h
mov ds:[v1],dl
print v1

感谢您的帮助。

print 67h
print al

1 个答案:

答案 0 :(得分:2)

使用较新的MASM(版本&gt; = 6),您可以使用TYPE指令为8位寄存器创建特殊条件。另外,看看我的改进:

.MODEL small
.386

.STACK
.DATA

.CODE

print_num MACRO value
LOCAL analyse, write, show
    pusha

    IF TYPE(value) eq 1         ; 8-bit register
        movzx ax, value
    ELSE
        mov ax, value
    ENDIF

    xor cx, cx          ; repetitions
    mov bx, 16          ; divisor

    analyse:            ; First step: push the digits into stack
        xor dx, dx      ; Clear DX for division
        div bx          ; DX:AX/BX = AX remainder DX
        push dx
        inc cx
        cmp ax, 0       ; break condition
        jne analyse

    write:              ; Second step: pop the digits from stack and print
        pop dx          ; Only DL is needed
        add dl, "0"
        cmp dl, "9"     ; Is DL digit?
        jbe SHORT show  ; Yes: skip the next line
        add dl, 7       ; Adjust ASCII
        show:
        mov ah, 2       ; Print character to STDOUT
        int 21h
        loop write

    popa
ENDM

Linefeed MACRO
    pusha
    mov ah, 2
    mov dl, 0Dh          ; CR = carriage return
    int 21h
    mov dl, 0Ah          ; LF = line feed
    int 21h
    popa
ENDM

main PROC
    mov ax, @data
    mov ds, ax

    mov ax, 1234h
    print_num ax
    Linefeed

    print_num al
    Linefeed

    print_num 126

    mov ax, 4C00h
    int 21h
main ENDP

END main