实验5第5题
代码如下: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
d segment
db 0, 0, 0, 0, 0, 0, 0, 0
d ends
code segment
start:mov ax, a
mov ds, ax
mov ax, d
mov es, ax
mov bx, 0
mov cx,8
s: mov ax, ds:
mov es:,ax
inc bx
loop s
mov ax, b
mov ds, ax
mov bx, 0
mov cx,8
s1: mov ax, ds:
add es:,ax
inc bx
loop s1
mov ax, 4c00h
int 21h
code ends
end start
代码哪里出错了?为什么结果不是2 4 6 8 10..... 本帖最后由 cnkizy 于 2018-1-28 12:38 编辑
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
d segment
db 0, 0, 0, 0, 0, 0, 0, 0
d ends
code segment
start: mov ax, a
mov ds, ax
mov ax, d
mov es, ax
mov bx, 0
mov cx,8
s: mov ax, ds:
mov es:,ax
inc bx
loop s
mov ax, b
mov ds, ax
mov bx, 0
mov cx,8
s1: mov ax, ds:
add es:,ax
inc bx ;你用的是16位寄存器,这里应该+2 而不是+1 所以这里应该是 add bx,2
loop s1
mov ax, 4c00h
int 21h
code ends
end start
inc bx的结果
add bx,2的结果
你用的是16位寄存器bx 这里要加2,如果你非要用inc指令也不是不可以,那得换成bh或者bl{:10_256:}
16位寄存器每次读取两个字节,你偏移的时候也应该加上2,inc bx 是加1的意思。
上面那个其实也应该用8位寄存器才对,因为数据是db类型,然后你的inc reg就对了
如下:
code segment
start: mov ax, a
mov ds, ax
mov ax, d
mov es, ax
mov bx, 0
mov cx,8
s: mov al, ds:
mov es:,al
inc bx
loop s
mov ax, b
mov ds, ax
mov bx, 0
mov cx,8
s1: mov al, ds:
add byte ptr es:,al
inc bx ;这里用的是8位寄存器 al,所以inc bx就对了
loop s1
mov ax, 4c00h
int 21h
code ends
cnkizy 发表于 2018-1-28 12:03
inc bx的结果
还米学那么远,还没学到ptr什么的 本帖最后由 cnkizy 于 2018-1-28 13:48 编辑
zhoujie13 发表于 2018-1-28 13:41
还米学那么远,还没学到ptr什么的
mov al, ds:
add byte ptr es:,al
上面的两句话
mov al, ds:
mov ah, es:
add ah,al
mov es:,ah
等价于这个意思 cnkizy 发表于 2018-1-28 13:46
上面的两句话
应该是db是8位,不能用ax,要用al 本帖最后由 cnkizy 于 2018-1-29 11:41 编辑
zhoujie13 发表于 2018-1-28 15:06
应该是db是8位,不能用ax,要用al
db是8位,可以用ax 要看你写程序的目的是什么。或者说 db里的东西是什么
例
db '19'
这时 要ax来读取了,因为他在内存中就是'31 39' ,两个字节。
当然像
db 7aH,23H,5H
这样 最好用 8位寄存器吧 读出来就是 7aH、23H,16位寄存器读出来就是 237aH 如果解决了楼主的问题 {:10_256:} 麻烦楼主 设置个最佳答案 @zhoujie13
页:
[1]