两者之间有什么区别
num db 1
mov ax,1
还有mov ax, num
执行mov ax,1
时是ASCII还是整数?
我的意思是,数字不是从键盘插入的,而是预定义的,是否可以将其转换为整数?是ASCII吗?
答案 0 :(得分:1)
num db 1,在内存中定义1个字节,并将其初始化为整数值1。
Mov ax,1是立即寻址模式,它将整数1传送(复制)到ax寄存器。与Mov ax一样,num是一个寄存器直接寻址模式,它将num中包含的值传输到ax寄存器。
对于ascii,请使用以下说明
num db'1';定义1个字节并初始化'1'ASCII值到内存中
战斧,'1'
Mov ax,num
'1'通过汇编程序转换了其等效的ASCII(整数49)代码。
答案 1 :(得分:1)
ASCII是编码类型,即您应如何解释某些数字值,例如“ 33是感叹号” ...
但是CPU不知道ASCII,mov al,33
只是将al
寄存器设置为位模式00100001
,并且当某些其他代码将该值用作ASCII字符时(例如绘制一些从提供的字体图形到显示的字形),它将显示为“感叹号”。
在CPU级别上,它只是数字33
。 mov al,'!'
和mov al,33
和mov al,21h
都将产生相同的二进制机器指令(将该位模式00100001加载到寄存器al
中),CPU没有区别。所有区别只是源的“格式化糖”(如果期望al
中的数字33被用作ASCII字符(mov al,'!'
,则使程序员更容易理解源的原始意图) ,或在某些计算中作为数字值(mov al,33
)。
要输入(在源代码中)ASCII字符值,请使用mov ax,'1'
之类的单引号,它将被汇编为mov ax,49
(在emu8086,MASM和几乎所有其他x86汇编器中,但是汇编程序的功能,您可能会遇到不理解这种“字符”语法的汇编程序,然后必须使用类似mov ax,49
的方法才能获得相同的结果。)
mov ax,num
会将al
(ax
的底部8位)设置为1,并将ah
(ax
的高8位)设置为一些未定义的值(您进行db 1
,但随后读取了单词,因此,为确保加载单词值1,应在地址num
上定义两个字节,例如num: db 1, 0
,或更容易阅读{{ 1}}(同样,两种变体为CPU生成相同的机器代码,只是源代码不同)。
如果要定义num: dw 1
,则在执行num: dw 1
与mov ax,1
之后,结果是相同的,在两种情况下,mov ax,num
都将包含值1。变量ax
编码在指令内部(1
是8086 CPU的B80100
的机器代码)。在第二个变体中(在Intel语法中,它是mov ax,1
,我强烈建议甚至与emu8086或MASM一起使用,以使在读取源代码时可以看到内存访问)确实从内存中读取了两个字节(此外,指令操作码的三个字节,之前已对其进行读取和解码)。
因此,mov ax,[num]
在大多数情况下可能会更高效,但是mov ax,1
更为灵活(某些东西可以修改内存中的值,因此结果将不再是{{1} },但该新修改后的值)。 (可能也可以自我修改指令mov ax,[num]
来更改机器代码中编码的值,但是通常不推荐使用此选项,因为这通常会使源代码更难以理解,并且在现代x86机器上具有严重的性能和安全隐患,因此这种做法已被放弃)