gpt4 book ai didi

assembly - 打印存储在字节中的值的宏。 assembly 体

转载 作者:行者123 更新时间:2023-12-04 17:20:16 28 4
gpt4 key购买 nike

程序集,masm

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

我将值除以 16,然后将提醒推送到堆栈,直到值==0。然后我弹出提醒将它们转换为 ASCII 码,并打印它们。

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

我不想每次都这样做:

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

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

print 67h
print al

感谢您的帮助。

assume  cs:code1
.186

dane1 segment
v1 dw 0D9h ;to use macro
dane1 ends

print macro value
pusha
mov ax,seg value
mov ds,ax
mov ax,ds:[value]
xor cx,cx ;CX - repetitions
analyse: ;pushes the digits into stack
mov dl,16 ;divisor
div dl ;divide number in AX by 16
xor dx,dx
mov dl,ah ;remainder into the stack
push dx
xor ah,ah ; prepare quotient for next loop
inc cx ;increase repetitions
cmp ax,0 ;break condition
jne analyse
begin1: ;print character stored in the stack
pop dx ;pop to DL
cmp dl,10d ;is DL digit or char
jb digit
char: ;convert to ASCII
add dl,55
jmp begin2
digit:
add dl,'0'
jmp begin2
begin2:
mov ah,2 ;print character converted to ASCII
int 21h
loop begin1
popa
endm

code1 segment

start1: mov ax,seg top1
mov ss,ax
mov sp,offset top1

print v1

mov ah,4ch
int 21h

code1 ends



stos1 segment stack
dw 200 dup(?)
top1 dw ?
stos1 ends

end start1

最佳答案

使用较新的 MASM(版本 >= 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

关于assembly - 打印存储在字节中的值的宏。 assembly 体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42993405/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com