鱼C论坛

 找回密码
 立即注册
查看: 4480|回复: 15

第6章实验5(5)的al,ax问题

[复制链接]
发表于 2013-4-1 12:32:15 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Ю銩補下' 于 2013-4-3 15:26 编辑
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
cc segment
db 0,0,0,0,0,0,0,0
cc ends
code segment
start: 
mov ax,a
mov ds,ax
mov ax,b
mov es,ax
mov ax,cc
mov ss,ax

mov bx,0
mov cx,8
s: mov al,ds:[bx]
mov ss:[bx],al
mov al,es:[bx]
add ss:[bx],al
inc bx
loop s

mov ax,4c00h
int 21h
code ends
这个是实验5(5)中,1次循环的方法,但是把红字的al换成ax也可以执行,结果是一样的。
之前学过,当把字节型数据放入通用寄存器时,要放入该寄存器的低八位,否则连编译都过不了,为什么此题不用放入低八位结果与放入低八位方法的结果是一样的呢
一下分别是用ax和al的调试结果
22.jpg 11.jpg

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-1 13:40:25 | 显示全部楼层

回帖奖励 +1 鱼币

又是我 结果肯定不一样啊~~你循环里面靠的是 AL 来匹配 类型的 当你用AL 时候循环8次是8个字节 你用AX 循环8次就变成8个字了     也就是说 你用AX的时候是复制过去了 16个字节  你用AL 只是复制了8个字节  虽然前面一样 后面就不一样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-1 19:24:13 | 显示全部楼层
对于本题,不是不用放入低8位,而是即使你改为ax,那么数据也只会存储在al中。因为数据进入通用寄存器的规则是,先填满低位后,再填满高位。而本题最大数字8连al都填不满,所以ah中不会有数据。结果当然一样啦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-1 19:38:53 | 显示全部楼层
漏个脸赚点分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-1 22:15:12 | 显示全部楼层

不是填满在放~~你用AX 就是 以 16位传数据~!  还有他的 AH 不是00   因为她没清零 保存的是 SS段地址高位数据~!如果他不在  MOV AL,DS.[BX]  地方改  在 mov ss:[bx].al 该你看数据还对不了~~呵呵你理解有错误帮你纠正下~!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-2 12:07:19 | 显示全部楼层
小小小小鱼 发表于 2013-4-1 22:15
不是填满在放~~你用AX 就是 以 16位传数据~!  还有他的 AH 不是00   因为她没清零 保存的是 SS段地址高位 ...

其实对于本题AH就是00。我们俩说的侧重点不一样。没必要争论
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-3 15:23:09 | 显示全部楼层
小小小小鱼 发表于 2013-4-1 13:40
又是我 结果肯定不一样啊~~你循环里面靠的是 AL 来匹配 类型的 当你用AL 时候循环8次是8个字节 你用AX 循环 ...

22.jpg 11.jpg 是一样的,我调试过得,结果都是一样的,我用debug单独调试ax中的内容,代码为al时,执行循环只变动al的值,若代码为ax时,执行循环变动整个ax的值,但是执行结果却是一样的。真心不知道这是为什么~~~~~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-3 16:21:59 | 显示全部楼层
用AL 其实复制了8次 用AX 是复制了4次 不信你用 AX 吧CX 赋值为4看看~!  你看到一样因为后面 全是零~!   你可以吧 数据段后面在定义8个字节  结果就不一样了~~或者 你 调试的时候 注意看 你用AL 是后 AH 里面装的是 你段地址的一部分~~你用 AX  里面 是 02 01 是以字形式传送的~!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-3 16:31:25 | 显示全部楼层
小小小小鱼 发表于 2013-4-3 16:21
用AL 其实复制了8次 用AX 是复制了4次 不信你用 AX 吧CX 赋值为4看看~!  你看到一样因为后面 全是零~!    ...

不要以为结果一样就是对的~~如果你程序的本意就是 复制前8个字节~! 那么你AL 就是对的~但是 你AX却复制了16个字节~~在一个程序中你这就是越界了~ 如果你 后八位不是零 是别的数据呢~ 如果你下面要复制的段 的后8位是用的数据 你不是把它给覆盖了~~  用AX 正确做法是 4次循环~~用 eax 就是2次循环~!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-5 16:54:03 | 显示全部楼层
真是被感动的痛哭流涕……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-12-31 20:19:05 | 显示全部楼层
学习学习再学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-2 16:25:40 | 显示全部楼层
努力 努力努力 再努力!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-10 10:20:31 | 显示全部楼层
学习好AX是字单元,AH、AL是字节单元,就很好理解了
到此一游,飘过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-13 10:51:41 | 显示全部楼层
有点不明白啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-13 10:58:35 | 显示全部楼层
C:\try>make 1.asm

Microsoft (R) Program Maintenance Utility  Version 4.05
Copyright (C) Microsoft Corp 1984-1987.  All rights reserved.

1.asm(2) : fatal error U1005: syntax error : colon missing

C:\try>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-30 10:49:19 | 显示全部楼层
assume cs:code
a segment
  db 1,2,3,4,5,6,7,8
a ends
b segment
  db 1,2,3,4,5,6,7,8
b ends
c segment
  db 0,0,0,0,0,0,0,0
c ends
code segment
    start:
        mov cx,8
        mov bx,0
    s:
         mov dl,0
         mov ax,a
         mov ds,ax
         mov dl,ds:[bx]
         mov ax,b
         mov ds,ax
         add dl,ds:[bx]
         mov ax,c
         mov ds,ax
         mov ds:[bx],dl
         inc bx
         loop s
   
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 20:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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