汇编语言编号:MOV AX、1 ASCII或整数 [英] Assembly language numbers: is MOV AX,1 ASCII or integer

查看:0
本文介绍了汇编语言编号:MOV AX、1 ASCII或整数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

num db 1
mov ax,1

mov ax, num

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

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

推荐答案

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

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

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

)。

要使用像mov ax,'1'这样的单引号输入ASCII字符值,它将汇编为mov ax,49(在emu8086、MASM和几乎所有其他x86汇编程序中,但这是汇编程序的功能,您可能会遇到不理解这种"字符"语法的汇编程序,然后您必须使用类似mov ax,49的内容才能得到相同的结果)。


mov ax,num会将al(ax的下8位)设置为1,并将ah(ax的上8位)设置为某个未定义值(您确实这样做了,但然后您读取了字,因此为了确保加载字值1,您应该在num地址定义两个字节,如num: db 1, 0或更易于读取num: dw 1(同样,这两个变体为CPU生成相同的机器码,区别仅在于源代码)。

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

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

这篇关于汇编语言编号:MOV AX、1 ASCII或整数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆