汇编,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
答案 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