|
主题 : : 实验五(5)(6)自己做的程序,请高手鉴定 [待解决] |
回复[ 11次 ]
点击[ 603次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2011-02-12 17:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-02-09 21:07 |
(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
c segment
db 0,0,0,0,0,0,0,0
c ends
code segment
start:
mov bx,0
mov cx,8
s:
;read a[bx]
mov ax,a
mov ds,ax
mov dl,ds:[bx]
;add b[bx]
mov ax,b
mov ds,ax
add dl,ds:[bx]
;write c[bx]
mov ax,c
mov ds,ax
mov ds:[bx],dl
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
(6)程序
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 0,0,0,0,0,0,0,0
b ends
code segment
start:
mov ax,a
mov ds,ax
mov ax,b
mov ss,ax
mov sp,16
mov cx,8
s:
push [bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2011-02-13 14:41 ]
[引用]
[回复]
[ top ] | |
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19 |
第一哦用计算好偏移地址就可以了。
mov ax,a
mov ds,ax
mov bx,0
mov cx,8
s:
mov al,[bx]
add al,[bx+8]
mov type ptr [bx+16],al
inc bx
loop s | | |
|
|
|
|
[第2楼]
[ 回复时间:2011-02-13 17:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-02-09 21:07 |
回复:[第1楼]
------------------
恩,第一个用偏移地址的话,是会方便的多。
做的时候考虑如果地址是难以确定的,应该怎么做程序,就成现在这样了。
做着做着,有个寄存器不够用的感觉。
比如做g = a * b + b * c + c * d + d * e...这样需要缓存许多中间数据的,寄存器就不太够用了,这时就需要用到堆栈什么的了吧? | | |
|
|
|
|
[第3楼]
[ 回复时间:2011-02-24 22:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-01-15 22:31 |
看好实验(6小节) 逆序 OK ADD 应该是 SUB的
mov ax,a
mov ds,ax
mov bx,8
mov ax,b
mov ss,ax
mov sp,17H // 空笺状态
mov cx,8
s:
push [bx]
sub bx,2
loop s | | |
|
|
|
|
[第4楼]
[ 回复时间:2011-02-25 00:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-02-09 21:07 |
回复:[第3楼]
------------------
第一,空栈的话,你看一下栈是多大,你设成17H,PUSH数据的时候已经压在b段之外了,我认为应该设置为16(10h)
第二,由于压栈的时候,是从栈的高地址向低地址生长,只要把a段中的内容顺序压栈,则在b段就就实现了逆序排放,a段的数据顺序排放、顺序读取,故而是ADD,而非SUB. | | |
|
|
|
|
[第5楼]
[ 回复时间:2011-02-25 20:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-01-15 22:31 |
呵呵 我也弄错列 应该是 16H
第2的话 我感觉 a:[bx] 直向的是 a:[1] 的1数据 题目是 逆序 送到 笺中 应该是 8-7-6-5-4。。。。。 | | |
|
|
|
|
[第6楼]
[ 回复时间:2011-02-25 23:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-02-09 21:07 |
回复:[第5楼]
------------------
第一个应该是10h,等于16。
第二个问题,的确a:[bx]中是1-2-3-4-5-这样存放的,但压栈的时候是从高地址向低地址长。也是如果把push 1进栈的话,栈中是 0 0 0 0 0 0 0 1,然后push 2后,栈中就是 0 0 0 0 0 0 2 1,一直到Push 8,栈中为 8 7 6 5 4 3 2 1。 | | |
|
|
|
|
[第7楼]
[ 回复时间:2011-04-11 23:30 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-04-11 23:18 |
第六题的解法完全错误,堆栈是从高位到低位存储,所以你push的数据和真实的数据完全是相反的,因为这里的数据是dw的,如果只有一个字节时才能保证这种解法的正确性。
eg 一个数据104AH 那么push进去应该是4A10 因为是从高往低存,所以仅仅push是不行的,所以push进去后应该马上pop到正确位置。加上这一句
pop ss:[(cx-1)*2]
意思是说 比如a段第一个数据要弄到b段的第八个位置,那么push后,把该数据弄到第八个地方就好了,也就是下标为7的地方
cx是递减的,所以刚好能够push到。 *2也就是2个字节
这是我的理解,如有错误,还请指正。 | | |
|
|
|
|
[第8楼]
[ 回复时间:2011-09-19 23:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:2
注册日期:2010-11-24 11:04 |
第六题的bx没有初始化,bx默认为0,push [bx]值就错误了,下面是我的程序:
;编写codeseg段的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中
assume cs:codeseg
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 0,0,0,0,0,0,0,0
b ends
codeseg segment
start:
mov ax,a
mov ds,ax
mov ax,b
mov ss,ax
mov bx,0
mov sp,16
mov cx,8
s: mov ax,[bx]
push ax
inc bx ;或者add bx,2 但感觉inc效率高些,而且两个inc也才两个字节,add bx,2三个字节了
inc bx
loop s
mov ax,4C00H
int 21H
codeseg ends
end start
程序虽然简单,但需要注意的地方很多,不仅仅是当前需求,对于以后的复杂需求,很多现在认为不必要的代码都是很重要的,所以得养成好习惯。 | | |
|
|
|
|
[第9楼]
[ 回复时间:2011-11-22 16:53 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-11-18 11:53 |
第六题的bx没有初始化,bx默认为0,push [bx]值就错误了,下面是我的程序:
;编写codeseg段的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中
assume cs:codeseg
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 0,0,0,0,0,0,0,0
b ends
codeseg segment
start:
mov ax,a
mov ds,ax
mov ax,b
mov ss,ax
mov bx,0
mov sp,16
mov cx,8
s: mov ax,[bx]
push ax
inc bx ;或者add bx,2 但感觉inc效率高些,而且两个inc也才两个字节,add bx,2三个字节了
inc bx
loop s
mov ax,4C00H
int 21H
codeseg ends
end start
程序虽然简单,但需要注意的地方很多,不仅仅是当前需求,对于以后的复杂需求,很多现在认为不必要的代码都是很重要的,所以得养成好习惯。
------------------
回复:你这里pop下sp就又回去了! 就算是反了一下,但是一直循环都没结束的时候!
而且你的这个栈取出来之后,那个值都错误了! 本来是0009的值,按你这样的能变成0900了! 差的太多了! | | |
|
|
|
|
[第10楼]
[ 回复时间:2011-11-22 16:54 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-11-18 11:53 |
|
|
|
|
|
[第11楼]
[ 回复时间:2011-11-23 12:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59 |
pop ss:[(cx-1)*2]
第一次见可以这样写。嘿嘿。麻烦先过debug或者masm再这样说。毕竟汇编不是c。 | | |
|