Ю銩補下' 发表于 2013-4-1 12:32:15

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

本帖最后由 Ю銩補下' 于 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:
mov ss:,al
mov al,es:
add ss:,al
inc bx
loop s

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


小小小小鱼 发表于 2013-4-1 13:40:25

又是我 结果肯定不一样啊~~你循环里面靠的是 AL 来匹配 类型的 当你用AL 时候循环8次是8个字节 你用AX 循环8次就变成8个字了   也就是说 你用AX的时候是复制过去了 16个字节你用AL 只是复制了8个字节虽然前面一样 后面就不一样了

1971827035 发表于 2013-4-1 19:24:13

对于本题,不是不用放入低8位,而是即使你改为ax,那么数据也只会存储在al中。因为数据进入通用寄存器的规则是,先填满低位后,再填满高位。而本题最大数字8连al都填不满,所以ah中不会有数据。结果当然一样啦。

NGtailang 发表于 2013-4-1 19:38:53

漏个脸赚点分

小小小小鱼 发表于 2013-4-1 22:15:12

1971827035 发表于 2013-4-1 19:24 static/image/common/back.gif
对于本题,不是不用放入低8位,而是即使你改为ax,那么数据也只会存储在al中。因为数据进入通用寄存器的规则 ...

不是填满在放~~你用AX 就是 以 16位传数据~!还有他的 AH 不是00   因为她没清零 保存的是 SS段地址高位数据~!如果他不在MOV AL,DS.地方改在 mov ss:.al 该你看数据还对不了~~呵呵你理解有错误帮你纠正下~!

1971827035 发表于 2013-4-2 12:07:19

小小小小鱼 发表于 2013-4-1 22:15 static/image/common/back.gif
不是填满在放~~你用AX 就是 以 16位传数据~!还有他的 AH 不是00   因为她没清零 保存的是 SS段地址高位 ...

其实对于本题AH就是00。我们俩说的侧重点不一样。没必要争论

Ю銩補下' 发表于 2013-4-3 15:23:09

小小小小鱼 发表于 2013-4-1 13:40 static/image/common/back.gif
又是我 结果肯定不一样啊~~你循环里面靠的是 AL 来匹配 类型的 当你用AL 时候循环8次是8个字节 你用AX 循环 ...

是一样的,我调试过得,结果都是一样的,我用debug单独调试ax中的内容,代码为al时,执行循环只变动al的值,若代码为ax时,执行循环变动整个ax的值,但是执行结果却是一样的。真心不知道这是为什么~~~~~~~~

小小小小鱼 发表于 2013-4-3 16:21:59

用AL 其实复制了8次 用AX 是复制了4次 不信你用 AX 吧CX 赋值为4看看~!你看到一样因为后面 全是零~!   你可以吧 数据段后面在定义8个字节结果就不一样了~~或者 你 调试的时候 注意看 你用AL 是后 AH 里面装的是 你段地址的一部分~~你用 AX里面 是 02 01 是以字形式传送的~!

小小小小鱼 发表于 2013-4-3 16:31:25

小小小小鱼 发表于 2013-4-3 16:21 static/image/common/back.gif
用AL 其实复制了8次 用AX 是复制了4次 不信你用 AX 吧CX 赋值为4看看~!你看到一样因为后面 全是零~!    ...

不要以为结果一样就是对的~~如果你程序的本意就是 复制前8个字节~! 那么你AL 就是对的~但是 你AX却复制了16个字节~~在一个程序中你这就是越界了~ 如果你 后八位不是零 是别的数据呢~ 如果你下面要复制的段 的后8位是用的数据 你不是把它给覆盖了~~用AX 正确做法是 4次循环~~用 eax 就是2次循环~!

Ю銩補下' 发表于 2013-4-5 16:54:03

真是被感动的痛哭流涕……

菜鸟一个a 发表于 2013-12-31 20:19:05

学习学习再学习

亚特兰蒂斯 发表于 2014-1-2 16:25:40

努力 努力努力 再努力!!

lms99251 发表于 2014-1-10 10:20:31

学习好AX是字单元,AH、AL是字节单元,就很好理解了
到此一游,飘过

xwbk12 发表于 2016-4-13 10:51:41

有点不明白啊

xwbk12 发表于 2016-4-13 10:58:35

C:\try>make 1.asm

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

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

C:\try>

一只河蟹 发表于 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:
       mov ax,b
       mov ds,ax
       add dl,ds:
       mov ax,c
       mov ds,ax
       mov ds:,dl
       inc bx
       loop s
   
code ends
end start
页: [1]
查看完整版本: 第6章实验5(5)的al,ax问题