当前位置:软件学习 > 其它软件 >>

x86汇编学习 ----- 六

 

自学了这么就的汇编,特别是寻址方式的学习,终于吧这个实验搞定了

 

 

;寻址方式综合运用 

;YoungWei        2011-10-8 

 

assume cs:codeseg,ds:data 

 

data segment 

    db 60h dup(0)       ;纯属为了练习寻址方式,才在这里使用60h个填充字符 

    ;一下数据是DEC公司1982年的信息 

    db  'DEC'          ;公司名称 

    db  'Ken Oslen'     ;总裁姓名 

    dw  137             ;总裁在富豪榜上得排名 

    dw  40              ;公司收入(单位亿) 

    db  'PDP'           ;公司著名产品 

data ends 

 

;该公司1988年时总裁在富豪榜排名问38 

;DEC收入增加70亿 

;著名产品变为VAX系列计算机 

 

;通过程序实现上述改变 

 

codeseg segment 

    start:  mov ax,data 

            mov ds,ax 

            mov bx,60h 

             

            mov word ptr [bx].0ch,38   ;修改总裁排名 

            add word ptr [bx].0eh,70    ;修改收入值 

             

            ;以下改变著名产品名 

            mov si,0 

            mov byte ptr [bx].10h[si],'V' 

            inc si 

            mov byte ptr [bx].10h[si],'A' 

            inc si 

            mov byte ptr [bx].10h[si],'X' 

             

            mov ax,4c00h 

            int 21h 

codeseg ends 

end start 

装入程序后查看内存状况

-d 146f:60

146F:0060  44 45 43 4B 65 6E 20 4F-73 6C 65 6E 89 00 28 00   DECKen Oslen..(.

146F:0070  50 44 50 00 00 00 00 00-00 00 00 00 00 00 00 00   PDP.............

 

通过查看其实第13个数据89h=137  第15个数据28h=40,

其实如果要节约内存这两个数据可以定义为byte类型。因为byte有8位可以表示整数0--255

 

程序运行完后内存状况

-d 146f:60

146F:0060  44 45 43 4B 65 6E 20 4F-73 6C 65 6E 26 00 6E 00   DECKen Oslen&.n.

146F:0070  56 41 58 00 00 00 00 00-00 00 00 00 00 00 00 00   VAX.............

通过查看其实第13个数据26h=38  第15个数据6eh=110,然后产品名也变成了VAX

 

其实这个程序改成C语言后更能想到如此处理

 

/*定义公司的结构体*/ 

struct company 

    char cn[4];     //公司名称 

    char hn[10];        //总裁名字 

    int pm;         //富豪榜排名 

    int sr;         //公司总收入 

    char cp[4];     //公司著名产品名 

}; 

结构体里面的字符串要比实际字符串多一个,我想大家应该知道原因吧-----在C语言中字符串以'\0'结束。

所以除了字符本身还要为'\0'预留一块内存

 

main() 

    struct company dec={"DEC","Ken Oslen",137,40,"PDP"};//初始化 

    dec.pm=38                    //改变富豪榜 

    dec.sr += 70;               //改变总收入 

    /*以下改变著名产品*/ 

    int i=0; 

    dec.cp[i]='V' 

    i++; 

    dec.cp[i]='A'; 

    i++; 

    dec.cp[i]='X'; 

    /*以下两句在汇编中是不需要的*/ 

    i++; 

    dec.cp[i]='\0'; 

上面c语言改变产品名时只是为了和汇编形成一一对应,其实现实中是不会这样做的,这样增加了代码量

只要一个语句就可以解决

 

strcpy(dec.cp,"VAX"); 

或者 

strncpy(dec.cp,"VAX",4);   

补充:软件开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,