求解释这三条指令是什么意思?
程序如下,编写code段中的内容,将a段和b段中的数据依次相加,将结果存到c段中。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 ax,a
mov ds,ax
mov bx,0
mov cx,8
s:
mov al,ds: //
add al,ds: //
mov ds:,al //求解释这三条指令是什么意思?
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
简单解释一下,第一条的意思是将基址为ds,偏移地址为bx的值放到al中,第二条是指将偏移地址为bx+16的值与al的值相加然后放到al里,第三条就是把al的值放到内存偏移地址为bx+32里头去,分析题目要求,私以为应该是+8和+16而不是+16和+32,希望能帮到你 mov al,ds: //将段地址为ds,偏移地址为bx的内存中的值移动到al中
add al,ds: //将段地址为ds,偏移地址为bx+16的内存中值加到al中
mov ds:,al //将al的值移动到段地址为ds,偏移地址为bx+32的内存中 渡漫 发表于 2017-11-4 09:16
简单解释一下,第一条的意思是将基址为ds,偏移地址为bx的值放到al中,第二条是指将偏移地址为bx+16的值与a ...
我也是这么觉得的,但是事实好像不是这样的 本帖最后由 兰陵月 于 2017-11-4 10:41 编辑
微笑向暖~ 发表于 2017-11-4 10:19
我也是这么觉得的,但是事实好像不是这样的
原先回答错误,忘记考虑段是16字节对齐方式。。。。。。。
晕死,我竟然犯了这种低级错误。 微笑向暖~ 发表于 2017-11-4 10:19
我也是这么觉得的,但是事实好像不是这样的
1、将段名称c改成d
2、将//改成;
编译后,你的程序运行结果正确 微笑向暖~ 发表于 2017-11-4 10:19
我也是这么觉得的,但是事实好像不是这样的
我这边程序运行正确,我不理解你所说的“事实好像不是这样的”是何意?????? 兰陵月 发表于 2017-11-4 10:31
原先回答错误,忘记考虑段是16字节对齐方式。。。。。。。
晕死,我竟然犯了这种低级错误。
汇编没学多少,想请教一下段是16字节对其方式是什么意思,为什么不是+8和+16呢? 渡漫 发表于 2017-11-4 11:43
汇编没学多少,想请教一下段是16字节对其方式是什么意思,为什么不是+8和+16呢?
16字节对齐的方式意思是一个段的长度(以字节计)能够被16整除。
如果程序员设计程序时,长度不是16的倍数,则系统自动补齐。 渡漫 发表于 2017-11-4 09:16
简单解释一下,第一条的意思是将基址为ds,偏移地址为bx的值放到al中,第二条是指将偏移地址为bx+16的值与a ...
私以为应该是+8和+16而不是+16和+32,希望能帮到你
上面这个理解是错误的,这就是没有考虑到段是16字节对齐的情况。 兰陵月 发表于 2017-11-4 12:30
16字节对齐的方式意思是一个段的长度(以字节计)能够被16整除。
如果程序员设计程序时,长度不是16的 ...
{:10_266:}{:10_266:}{:10_266:}貌似我还没学到这就开始误导人了,真是嗅大了,不过也理解了,谢谢 渡漫 发表于 2017-11-4 13:14
貌似我还没学到这就开始误导人了,真是嗅大了,不过也理解了,谢谢
没事,其实有时候就是突然忘记了而已,比如最开始的回答就是跟你一样,哈哈 兰陵月 发表于 2017-11-4 10:49
我这边程序运行正确,我不理解你所说的“事实好像不是这样的”是何意??????
我原来的理解呢,也是加8和加16,但是程序中呢,是加16和加32,这是我不理解的地方,后来我想清楚了,虽然定义的是字节数据,应该是加8和加16的,但是...........................,好吧,我也不知道我是怎么想的,反正,,不知道该怎么说了
页:
[1]