. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  一段乘法程序  [待解决] 回复[ 3次 ]   点击[ 284次 ]  
regex
[帖 主]   [ 发表时间:2010-01-10 11:49 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
练习题目来自【实验五】5小题。
将a段和b段数据相乘, 结果存入c段。
练习代码如下:

$ cat lixi.asm
assume  cs:code

a       segment
        dw      2,4,6,8,10
a       ends

b       segment
        dw      1,3,5,7,9
b       ends

c       segment
        dw      0,0,0,0,0
c       ends

code    segment

start:  mov ax,a
        mov ds,ax

        mov ax,b
        mov es,ax

        mov ax,c
        mov ss,ax

        mov bx,0
        mov cx,10

s:      mov dx,cx
        mov cx,es:[bx]
        sub ax,ax
s0:     add ax,[bx]
        loop s0
        mov ss:[bx],ax
        mov cx,dx
        add bx,2
        loop s

        mov ah,4ch
        int 21h

code    ends

end     start


root@yeah /cygdrive/d/asm
$

实验结果如下:

(调试过程略)
;运行前各段存贮状态
-d ds:0 9
18C9:0000  02 00 04 00 06 00 08 00-0A 00                     ..........
-d es:0 9
18CA:0000  01 00 03 00 05 00 07 00-09 00                     ..........
-d ss:0 9
18CB:0000  00 00 00 00 00 00 00 00-00 00                     ..........
-g 2a

AX=0024  BX=0014  CX=0000  DX=0001  SP=0000  BP=0000  SI=0000  DI=0000
DS=18C9  ES=18CA  SS=18CB  CS=18CC  IP=002A   NV UP EI PL NZ NA PE NC
18CC:002A B44C          MOV     AH,4C
-t

AX=4C24  BX=0014  CX=0000  DX=0001  SP=0000  BP=0000  SI=0000  DI=0000
DS=18C9  ES=18CA  SS=18CB  CS=18CC  IP=002C   NV UP EI PL NZ NA PE NC
18CC:002C CD21          INT     21
-p

Program terminated normally
;运行后各段状态, 结果放在SS:0~9
-d ds:0 9
18C9:0000  02 00 04 00 06 00 08 00-0A 00                     ..........
-d es:0 9
18CA:0000  01 00 03 00 05 00 07 00-09 00                     ..........
-d ss:0 9
18CB:0000  02 00 0C 00 1E 00 38 00-5A 00                     ......8.Z.
-q

D:\ASM>

前六章的学习, 基本告一段落, 开始进入第七章的学习啦。。。
regex
[第1楼]   [ 回复时间:2010-01-10 11:59 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
核心代码的解释:
s:      mov dx,cx        ;大循环S开始。先保存作为S循环计数的CX的值
        mov cx,es:[bx]   ;把EX:[BX]放入CX,作为小循环S0计数 
        sub ax,ax        ;AX清零
s0:     add ax,[bx]      ;开始小循环S0。开始累加, 结果暂存至AX
        loop s0          ;如CX不为零,则跳至S0,继续,否则, 执行下面语句
        mov ss:[bx],ax   ;把暂存在AX的结果放入地址单元SS
        mov cx,dx        ;恢复CX的值, 便于循环S使用
        add bx,2         ;bx指向下一个字
        loop s           ;

请大家指点。
versaariel
[第2楼]   [ 回复时间:2010-01-11 13:37 ]   [引用]   [回复]   [ top ] 
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14
1.
s:      mov dx,cx        ;push cx
.......
mov cx,dx                ;pop cx
//可读性更强点
当然你这里ss用来保存最终结果了,直接用的话会覆盖数据了,呵呵
2.
数据可以定义为db吧,数据不大,这样mov cx,5就行了
蛮好的,加油
regex
[第3楼]   [ 回复时间:2010-01-11 14:51 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
1, 哦, 可以利用栈操作!
2,这个倒不是问题。我觉得嵌套循环怪好玩的~~
3,多谢老兄指点 ^_^
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved