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

Assembly language numbers: is MOV AX,1 ASCII or integer

有什么区别

num db 1
mov ax,1

mov ax, num

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

我的意思是,数字不是从键盘输入的,它是预定义的,可能会要求将其转换为整数吗?它是 ASCII 码吗?

num db 1,在内存中定义1个字节,并初始化为整数值1。

Mov ax,1 是一种立即寻址模式,它将整数 1 传输(复制)到 ax 寄存器。而 Mov ax, num 是一种寄存器直接寻址模式,它将 num 中包含的值传输到 ax 寄存器。


对于 ASCII,您使用以下指令:

num db '1';定义 1 个字节并将“1”ASCII 值初始化为内存

Mov ax,'1'

Mov ax,num ; “1”已由汇编程序转换为其等效的 ASCII(整数 49)代码。

ASCII 是编码类型,即您应该如何解释某些数值,例如“33 是感叹号”...

但是 CPU 不知道 ASCII,mov al,33 只是将 al 寄存器设置为位模式 00100001,当其他一些代码将使用该值作为ASCII 字符(比如从提供的字体图形中绘制一些字形到显示器),它将显示为 "exclamation mark".

在 CPU 级别上,它只是数字 33mov al,'!'mov al,33mov al,21h 都会产生二进制相同的机器指令(将位模式 00100001 加载到寄存器 al),CPU 没有区别。所有的区别只是源代码的"formatting sugar"(如果希望将al中的数字33用作ASCII字符(mov al,'!',则程序员更容易理解源代码的初衷), 或者作为某些计算中的数值 (mov al,33)).

要输入(在源代码中)ASCII 字符值,请使用单引号,如 mov ax,'1',这将 assemble 作为 mov ax,49(在 emu8086、MASM 和几乎所有的其他 x86 assemblers,但它是 assembler 的特性,你可以 运行 进入 assemblers 不理解这个 "character" 语法,然后你将不得不使用 mov ax,49 之类的东西来获得相同的结果)。


mov ax,num 会将 alax 的低 8 位)设置为 1,并将 ahax 的高 8 位)设置为一些未定义的值(你做了 db 1,但是你读了字,所以为了确保你加载字值 1,你应该在地址 num 定义两个字节,比如 num: db 1, 0 或更容易阅读num: dw 1(同样,两种变体为 CPU 生成相同的机器代码,区别仅在于源代码)。

如果您定义 num: dw 1,那么在执行 mov ax,1mov ax,num 之后,结果是相同的,在这两种情况下 ax 都将包含值 1。但是在第一个变体值 1 在指令本身内编码(B80100mov ax,1 的机器代码,用于 8086 CPU)。在第二个变体中(在 Intel 语法中它是 mov ax,[num],我强烈建议将其与 emu8086 或 MASM 一起使用,以便在阅读源代码时使内存访问可见)确实从内存中读取了两个字节(除了指令操作码的三个字节,之前已读取+解码)。

所以mov ax,1可能在大多数情况下性能更高,但是mov ax,[num]更灵活(有些东西可以修改内存中的值,那么结果将不再是1,但那个新的修改值)。 (可能 也可以自我修改指令 mov ax,1 以更改机器代码中编码的值,但该选项通常不受欢迎,因为它通常使源代码更难获取理解,它对现代 x86 机器有严重的性能和安全影响,所以这种做法已被放弃)