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);
补充:软件开发 , 其他 ,