. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验五(5)(6)自己做的程序,请高手鉴定  [待解决] 回复[ 11次 ]   点击[ 603次 ]  
zoudaokou2006
[帖 主]   [ 发表时间: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
masmaster
[第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
zoudaokou2006
[第2楼]   [ 回复时间:2011-02-13 17:36 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-02-09 21:07
回复:[第1楼]
------------------
恩,第一个用偏移地址的话,是会方便的多。
做的时候考虑如果地址是难以确定的,应该怎么做程序,就成现在这样了。
做着做着,有个寄存器不够用的感觉。
比如做g = a * b + b * c  + c * d + d * e...这样需要缓存许多中间数据的,寄存器就不太够用了,这时就需要用到堆栈什么的了吧?
wlzaini1314
[第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
zoudaokou2006
[第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.
wlzaini1314
[第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。。。。。
zoudaokou2006
[第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。
qinmian123
[第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个字节
这是我的理解,如有错误,还请指正。
xohome
[第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
程序虽然简单,但需要注意的地方很多,不仅仅是当前需求,对于以后的复杂需求,很多现在认为不必要的代码都是很重要的,所以得养成好习惯。
wangxirui
[第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了!   差的太多了!
wangxirui
[第10楼]   [ 回复时间:2011-11-22 16:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-11-18 11:53
错了!  是回复的7楼!
chinatree
[第11楼]   [ 回复时间:2011-11-23 12:13 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
pop ss:[(cx-1)*2]
第一次见可以这样写。嘿嘿。麻烦先过debug或者masm再这样说。毕竟汇编不是c。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved