我正在使用MASM编译器和DOSBOX。我想把变量的值保存到寄存器中。我想把num1
的值保存到cx
寄存器中。我该怎么做呢?
.MODEL SMALL
.STACK 50H
.DATA
num1 db '5'
NL DB 0DH, 0AH, '$'
msg db ?,0AH,0DH,"Enter an odd number between 0 to 10:$"
nxtline db 0Ah,0DH,"$"
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
LEA DX,msg
mov ah,9
int 21H
LEA DX,nxtline
mov ah,9
int 21H
MOV AH,1
INT 21H
LEA DX,nxtline
mov ah,9
int 21H
mov bl,al ;save the value from input
mov num1,bl
LEA DX,num1
mov ah,9
int 21H
mov cl,al
main endp
end main
2条答案
按热度按时间xxslljrj1#
用户在
AL
中输入的值正在丢失。使用以下命令输入一个字符:字符存储在
AL
中,但在将值保存到BL
中之前,显示一个换行符:AL
中的值消失了,因为这个中断使用AL
来显示一个字符串,解决方法是在显示换行符之前**将值保存在BL
中:**编辑:**将值移入
CX
:628mspwn2#
顺便说一句:你发布的源代码,不能编译(
num1
没有定义)。一般来说,要将值从存储器加载到寄存器中,可以使用:
示例:
汇编程序将其编译为包含值
7
的单字节,并将标记num1
记录到符号表中,标记num1
存在,指向该字节。这将被编译为两个字节:
09 08
(数字的最低有效部分首先进入内存,因此09
位于num2
地址,08
位于num2+1
地址)。num2
标签放入符号表,指向定义字的第一个字节(值09
)。要将8位值从
bl
加载到16位寄存器cx
中,您有几种选择,但都遵循相同的原则,您必须将8位值扩展为16位"宽"。为了验证这些工作,在调试器中启动代码,并观察寄存器值在跳过每个指令后的变化。
您更新的问题是"如何在x86汇编程序中显示数字"。
参见https://stackoverflow.com/tags/x86/info,搜索"如何处理多位数字?"
但首先你可能还应该搜索什么是ASCII,"字符串"在计算机中是如何工作的,以及它们与寄存器中的数字值有何不同。
在大多数平台上(DOS也是),你不能只执行
mov cx,1234
并在屏幕上用一条指令将其打印为字符串"1234"。你必须首先在某个内存缓冲区中构建一个包含五个字符1234$
的ASCII字符串(来自cx
中的16b数值),然后你可以使用int 21h,9
来显示该字符串。