任何人都可以告诉我纯粹的汇编代码以十进制格式显示寄存器中的值吗?请不要建议使用printf hack,然后使用gcc进行编译.
描述:
好吧,我做了一些研究和NASM的一些实验,并认为我可以使用c库中的printf函数来打印整数.我是通过使用GCC编译器编译目标文件来完成的,所有工作都很公平.
但是,我想要实现的是以十进制形式打印存储在任何寄存器中的值.
我做了一些研究,发现DOS命令行的中断向量021h可以显示字符串和字符,而2或9位于ah寄存器中,数据在dx中.
结论:
我找到的所有示例都没有显示如何在不使用C库的printf的情况下以十进制形式显示寄存器的内容值.有没有人知道如何在装配中这样做?
当我在16位汇编中添加两个值时,将结果打印到控制台的最佳方法是什么?
目前我有这个代码:
;;---CODE START---;;
mov ax, 1 ;put 1 into ax
add ax, 2 ; add 2 to ax current value
mov ah,2 ; 2 is the function number of output char in the DOS Services.
mov dl, ax ; DL takes the value.
int 21h ; calls DOS Services
mov ah,4Ch ; 4Ch is the function number for exit program in DOS Services.
int 21h ; function 4Ch doesn't care about anything in the registers.
;;---CODE END---;;
Run Code Online (Sandbox Code Playgroud)
我认为dl值应该是ASCII码,但我不确定如何在添加到ASCII后转换ax值.
在这里,我尝试了一些方法来打印 10 到 0 的十进制数字emu8086。
.MODEL SMALL
.STACK 100H
.DATA
NUM DB 58D
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
START:
CMP NUM,48D
JGE PRINT
JMP END_
PRINT:
MOV AH,2
MOV DL,NUM
INT 21H
DEC NUM
JMP START
END_:
MOV AH,4CH
MAIN ENDP
END MAIN
Run Code Online (Sandbox Code Playgroud)
它在打印 9 到 0 时工作得很好,但它不是打印 10 而是打印asciivalue 的字符10d。我是 .so 的新手,assembly language如何打印 0 到 100 个十进制数字?
我的汇编中的简单程序有问题.我正在使用DOSbox和TASM.我有程序问题.操作数类型与第76 78 80行不匹配.这是在乘法之后.我尝试使用difftrent变量大小进行一些更改
; --------------------------------------------
; Equation=(a+c*b)/d-2*c,
; --------------------------------------------
.model small
.stack 100h
.data
a db 0
b db 0
c db 0
d db 0
result1 db ?
result2 db ?
message1 db "Equation: (a+c*b)/d-2*c a=$"
message2 db "b=$"
message3 db "c=$"
message4 db "d=$"
message5 db "Result=$"
.code
start: mov ax,@data
mov ds,ax
mov ax, seg message1 ;get a and save to a variable
mov ds,ax
mov dx,offset message1
mov ah, 9h
int 21h
mov ah, 1h
int …Run Code Online (Sandbox Code Playgroud) 我的汇编代码有问题。我想打印存储在寄存器cx中的数字,但是当我尝试打印它时,它打印的是ascii字符而不是ascii数字,所以我决定编写一个过程将ascii字符转换为ascii值。问题是,当我尝试调用该过程时,程序冻结,我必须重新启动 dosbox。有谁知道这段代码有什么问题吗?谢谢。
P4 PROC
MOV AX,CX ;CX = VALUE THAT I WANT TO CONVERT
MOV BX,10
ASC2:
DIV BX ;DIV AX/10
ADD DX,48 ;ADD 48 TO REMAINDER TO GET ASCII CHARACTER OF NUMBER
PUSH AX ;SAVE AX
MOV AH,2 ;PRINT REMAINDER STORED IN DX
INT 21H ;INTERRUP
POP AX ;POP AX BACK
CMP AX,0
JZ EXTT ;IF AX=0, END OF THE PROCEDURE
JMP ASC2 ;ELSE REPEAT
EXTT:
RET
P4 ENDP
Run Code Online (Sandbox Code Playgroud)