汇编语言 实验5,第(5)题的编程我是这样写的,不知对否
assume cs:codea 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 bx, 0
mov ax, cs
sub ax, 3h
mov ds, ax
mov ax, cs
sub ax, 2h
mov ss, ax
mov ax, cs
sub ax, 1h
mov es, ax
mov cx, 8
s:mov al,
mov es:, al
inc bx
loop s
mov bx, 0
mov cx, 8
s0:mov al, es:
mov dl, ss:
add al, dl
mov es:, al
inc bx
loop s0
mov ax, 4c00h
int 21h
code ends
end start
第一我想问一下 sub ax, 3h
sub ax, 2h
sub ax, 1h
这是什么用途?能读到a,b,c段的正确地址吗?我debug了一下。用d命令查看了。发现读不出来a,b,c的段地址
由此引发的问题就是,你读的数据不是a,b段的数据,你的结果也写不进c段。
第二你把ss段这个栈段寄存器当ds寄存器来用了。你的代码中写出了这样的语句mov dl, ss:
没有这个用法吧。 要正确读到前面定义的a,b,c段的地址,应该这样写啊
mov ax,a
mov ds,ax
mov bx,b
mov es,bx我明白你的想法,你想把a,b,c段直接在前面就把他们的段地址给确定好,但是能用的段寄存器只有ds,和es。所以你想到了动用ss的想法。但是应该不可以这样用ss的。(我百度了一下,貌似有这个强行将ss栈寄存器当普通段寄存器来用的,就是有ss:这个用法。不过我感觉最好别这样用。)
贴上标准答案你自己揣摩一下吧
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 ax,b
mov es,ax
mov bx,0
mov cx,8
s: mov al,
add es:,al
inc bx
loop s
mov ax,c
mov ds,ax
mov bx,0
mov cx,8
s0: mov al,es:
mov ,al
inc bx
loop s0
mov ax,4c00h
int 21h
code ends
end start
{:5_91:}我也是刚学汇编,说的不对,望指正。
本帖最后由 lukelqz 于 2012-7-23 14:07 编辑
楼主不好意思,当我前面说的放屁。你写的代码没有问题。只不过有点非主流。debug调试结果在附件。我开始的第一条说错了。第二条也有这种用法。I'm sorry。
谢谢你的回答,我的答题思路是按照前面那几个实验说如果段中的地址占N个字节,则程序加载后,该段实际的占有空间为16*(16/N +1)这个思路来解题的,我本想去网站去找找小甲鱼的答案,没找到,才贴出来的,看了你的答案我才恍然大悟,原来刚开始assume那里没有进行ss:a 这种声明过也可以mov ax, a段地址操作的,真的谢谢! 无限幻想 发表于 2012-7-24 09:08 static/image/common/back.gif
谢谢你的回答,我的答题思路是按照前面那几个实验说如果段中的地址占N个字节,则程序加载后,该段实际的占有 ...
{:5_91:}其实想说,我昨天看你做的时候,我刚好把第6章看完,实验五,还没做,没看到前面的段地址16*(16/n+1)的结论。昨天晚上我才从头看实验五的。我也懂了你为什么那样编了。呵呵,互勉互勉
页:
[1]