关于寻址方式格式的问题,求解?
学了一部分小甲鱼老师的零基础学习汇编语言视频,在编程编译时发现一个问题,如下程序:assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
db '1. display ' ;16个字节单元
db '2. brows '
db '3. replace '
db '4. modify '
datasg ends
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov bx,0
mov ax,stacksg
mov ss,ax
mov sp,16
mov cx,4
s0: push cx
mov si,0
mov cx,4
s: mov al,
and al,11011111b
mov ,al
inc si
loop s
add bx,16
pop cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
如果把改成或者时,编译出错,怎么回事?是这种书写格式错误还是这种格式只能mov ax,,不能mov al,?还是其他问题?
迷惑ing........
恳请各位大师大神前来解惑!!!!!! 怎么没人。。。。。。 你要写成这种形式:mov al,吗?
编译器不认识这种形式,你需要指定移动几个字节就行了,
比如说改成 mov al,byte ptr就好了 源操作数是16位的,只能用ax ghvn7777 发表于 2015-1-17 10:58
你要写成这种形式:mov al,吗?
编译器不认识这种形式,你需要指定移动几个字节就行了,
比如说改成 mo ...
但是我写成:mov al,就可以编译成功,只是换了一下位置而已,就不行 程序编的没有错,至于格式什么问题,我也迷惑ing,不过建议你试试3.或者.3多试几种,看看是哪里出错,其实我感觉有对的就行了,以后就按着对的写就完了,不用太过深究,毕竟不用这个写大型程序:lol: 已经指明了是al,应该用不到byte ptr了,一个字符是占一个字节的,也用不到ax,楼上那两位朋友,我不同意你们的看法。 又看了一遍第7章,更灵活的寻址方式,确实没有idata++这类的形式。那么就说明没有这种格式,BX+SI(或者DI)+IDATA,形如SI+DI,BX+BP都是错的,小甲鱼有句话说的是汇编的发明者不允许有其它格式,怕太多搭配而把格式弄混,所以是限定了格式,估计是这样。 本帖最后由 浪尖吹风 于 2015-1-20 04:05 编辑
傲天 发表于 2015-1-19 22:27
又看了一遍第7章,更灵活的寻址方式,确实没有idata++这类的形式。那么就说明没有这种格式,BX+SI(或 ...
小甲鱼老师视频里有很多格式,就是不知道是编译器问题,还是al是否不能用这种格式? 编译器 本帖最后由 pengyuwa 于 2015-1-20 16:28 编辑
每个命令都是由指令集决定的 就好比 我们交流 你能听懂,证明我们共用一种语言,就像CPU共用一种指令集一样,你说的那种表达式不在cup识别范围内,就好比你那句翻译成 16进制 是8B443303(mov eax,dword ptr ds:),8B4433XX 后面的xx表示加的立即数, 改成 mov al,byte ptr就行了,请试试。 浪尖吹风 发表于 2015-1-20 03:59
小甲鱼老师视频里有很多格式,就是不知道是编译器问题,还是al是否不能用这种格式?
我没试过al,但估计可以的,按图上的那几种格式,估计都可以的,偏移地址和内容是两个概念,你用al就是字节,你用ax就是字,所以取的内容和al,ax应该没有关系。格式对了就可以 哦,图上也有你写的那种格式,我也弄不明白了:sweat:不过确实很奇怪 只能mov ax,,不能mov al,
ax是16位寄存器,al低八位,地址也是16位。
不匹配。 s1986qq 发表于 2015-1-22 12:14
只能mov ax,,不能mov al,
ax是16位寄存器,al低八位,地址也是16位。
不匹配。
你没看清楚我所指的问题关键所在,mov al,成功编译,而mov al,不能编译。
另外,内存单元通过mov指令传送数据,只要有指明寄存器就可以了。 @小甲鱼 我也不是很懂 但是你要确定 他们相加后的结果al能装下如果有超出也不会影响到你的程序运行这样的情况除掉之后就能肯定是不是格式问题了 我感觉是这样也不知道对不对
你要写成这种形式:mov al,吗?
编译器不认识这种形式,你需要指定移动几个字节就行了,
比如说改成 mov al,byte ptr就好了
页:
[1]