鱼C论坛

 找回密码
 立即注册
查看: 3824|回复: 19

[已解决]关于寻址方式格式的问题,求解?

[复制链接]
发表于 2015-1-16 17:35:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
学了一部分小甲鱼老师的零基础学习汇编语言视频,在编程编译时发现一个问题,如下程序:
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,[bx+si+3]
                        and al,11011111b
                        mov [bx+si+3],al
                        inc si
                        loop s
                       
                        add bx,16
                        pop cx
                        loop s0
                       
                        mov ax,4c00h
                        int 21h       
codesg ends
end start
如果把[bx+si+3]改成[bx+3+si]或者[3+bx+si]时,编译出错,怎么回事?是这种书写格式错误还是这种格式只能mov ax,[bx+3+si],不能mov al,[bx+3+si]  ?还是其他问题?
迷惑ing........
最佳答案
2020-2-16 13:25:41

你要写成这种形式:mov al,[bx+3+si]  吗?
编译器不认识这种形式,你需要指定移动几个字节就行了,
比如说改成 mov al,byte ptr[bx+3+si]就好了
1.gif
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-1-16 17:36:41 | 显示全部楼层
恳请各位大师大神前来解惑!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-17 10:49:08 | 显示全部楼层
怎么没人。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-17 10:58:03 | 显示全部楼层
你要写成这种形式:mov al,[bx+3+si]  吗?
编译器不认识这种形式,你需要指定移动几个字节就行了,
比如说改成 mov al,byte ptr[bx+3+si]就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-17 10:59:28 | 显示全部楼层
源操作数是16位的,只能用ax
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2015-1-17 15:54:26 | 显示全部楼层
ghvn7777 发表于 2015-1-17 10:58
你要写成这种形式:mov al,  吗?
编译器不认识这种形式,你需要指定移动几个字节就行了,
比如说改成 mo ...

但是我写成:mov al,[bx+si+3]就可以编译成功,只是换了一下位置而已,就不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-19 20:56:26 | 显示全部楼层
程序编的没有错,至于格式什么问题,我也迷惑ing,不过建议你试试3[bx].[si]或者[bx].3[si]多试几种,看看是哪里出错,其实我感觉有对的就行了,以后就按着对的写就完了,不用太过深究,毕竟不用这个写大型程序:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-19 20:59:46 | 显示全部楼层
已经指明了是al,应该用不到byte ptr了,一个字符是占一个字节的,也用不到ax,楼上那两位朋友,我不同意你们的看法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-19 22:27:41 | 显示全部楼层
又看了一遍第7章,更灵活的寻址方式,确实没有idata+[bx]+[si]这类的形式。那么就说明没有这种格式,BX+SI(或者DI)+IDATA,形如SI+DI,BX+BP都是错的,小甲鱼有句话说的是汇编的发明者不允许有其它格式,怕太多搭配而把格式弄混,所以是限定了格式,估计是这样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-20 03:59:15 | 显示全部楼层
本帖最后由 浪尖吹风 于 2015-1-20 04:05 编辑
傲天 发表于 2015-1-19 22:27
又看了一遍第7章,更灵活的寻址方式,确实没有idata++[si]这类的形式。那么就说明没有这种格式,BX+SI(或 ...

小甲鱼老师视频里有很多格式,就是不知道是编译器问题,还是al是否不能用这种格式?
034第七章 更灵活定位内存地址03_20151204710.JPG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-20 13:30:02 | 显示全部楼层
编译器
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-20 16:25:58 | 显示全部楼层
本帖最后由 pengyuwa 于 2015-1-20 16:28 编辑

每个命令都是由指令集决定的 就好比 我们交流 你能听懂,证明我们共用一种语言,就像CPU共用一种指令集一样,你说的那种表达式不在cup识别范围内,就好比你那句翻译成 16进制 是8B443303(  mov eax,dword ptr ds:[ebx+esi+0x3]),8B4433XX 后面的xx表示加的立即数,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-20 18:39:12 | 显示全部楼层
改成 mov al,byte ptr[bx+3+si]就行了,请试试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-20 21:58:01 | 显示全部楼层
浪尖吹风 发表于 2015-1-20 03:59
小甲鱼老师视频里有很多格式,就是不知道是编译器问题,还是al是否不能用这种格式?

我没试过al,但估计可以的,按图上的那几种格式,估计都可以的,偏移地址和内容是两个概念,你用al就是字节,你用ax就是字,所以取的内容和al,ax应该没有关系。格式对了就可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-20 22:01:50 | 显示全部楼层
哦,图上也有你写的那种格式,我也弄不明白了:sweat:不过确实很奇怪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-22 12:14:28 | 显示全部楼层
只能mov ax,[bx+3+si],不能mov al,[bx+3+si]
ax是16位寄存器,al低八位,[bx+3+si]地址也是16位。
不匹配。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-23 10:46:08 | 显示全部楼层
s1986qq 发表于 2015-1-22 12:14
只能mov ax,,不能mov al,
ax是16位寄存器,al低八位,地址也是16位。
不匹配。

你没看清楚我所指的问题关键所在,mov al,[bx+si+3]成功编译,而mov al,[bx+3+si]不能编译。
另外,内存单元通过mov指令传送数据,只要有指明寄存器就可以了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-23 10:47:32 | 显示全部楼层
@小甲鱼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-30 21:19:24 | 显示全部楼层
我也不是很懂   但是你要确定 他们相加后的结果al能装下  如果有超出也不会影响到你的程序运行  这样的情况除掉之后就能肯定是不是格式问题了   我感觉是这样  也不知道对不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-16 13:25:41 | 显示全部楼层    本楼为最佳答案   

你要写成这种形式:mov al,[bx+3+si]  吗?
编译器不认识这种形式,你需要指定移动几个字节就行了,
比如说改成 mov al,byte ptr[bx+3+si]就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-28 23:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表