汇编语言编号:是MOV AX,1个ASCII或整数

时间:2018-11-14 05:31:14

标签: assembly masm emu8086

两者之间有什么区别

num db 1
mov ax,1

还有mov ax, num

执行mov ax,1时是ASCII还是整数?

我的意思是,数字不是从键盘插入的,而是预定义的,是否可以将其转换为整数?是ASCII吗?

2 个答案:

答案 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级别上,它只是数字33mov al,'!'mov al,33mov 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会将alax的底部8位)设置为1,并将ahax的高8位)设置为一些未定义的值(您进行db 1,但随后读取了单词,因此,为确保加载单词值1,应在地址num上定义两个字节,例如num: db 1, 0,或更容易阅读{{ 1}}(同样,两种变体为CPU生成相同的机器代码,只是源代码不同)。

如果要定义num: dw 1,则在执行num: dw 1mov 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机器上具有严重的性能和安全隐患,因此这种做法已被放弃)