第4章汇编措辞_第1页
第4章汇编措辞_第2页
第4章汇编措辞_第3页
第4章汇编措辞_第4页
第4章汇编措辞_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、汇编语言程序设计第四章 汇编语言程序设计鹤仙张吞孝瞒磷魔钥磁初倪纹唾蜜也隧烯茫的戊核谍危兄辈敖嚷搏视石植第4章 汇编语言第4章 汇编语言汇编语言介绍第4.1节 汇编语言介绍一. 汇编语言种类绝对汇编:只能将助记符转换成机器码符号汇编:增加了段的定义,可用符号表示变量、常数、地址等宏汇编:增加了宏指令、结构、记录等高级功能二. 伪指令 编译后不产生代码,仅在编译时起控制或指示作用。如:OFFSET三. 宏指令 将常用的一系列指令定义成一条宏指令,编译时先对宏指令进行预处理宏展开,再对展开之后的程序进行编译。四. 汇编程序开发过程编辑源程序编译连接调试虱侦诫诧馈异凿圃贾女摔健终蠕辱螟疑削掂椅单馆摸

2、夷梗晴例周削殃妨馆第4章 汇编语言第4章 汇编语言汇编语言介绍1. 编辑 编辑后形成源程序文件 *.asm,以ASCII码形式存盘2. 编译 对源程序*.asm进行编译,形成*.obj文件,以二进制形式存盘 编译工具: masm / tasm 例: masm auto.asm3. 连接 将1个或多个*.obj文件进行连接,形成*.exe或* 文件 连接工具: link / tlink 例: link auto.obj4. 调试 对程序进行调试,调试工具:TD.exe 或 debug.exe.COM文件与.EXE文件的区别.COM文件是内存映像文件,直接装入内存即可执行,其中代码、数据、堆栈、扩

3、展4个段完全重合,程序不超过64KB,装入执行较快.EXE文件不是内存映像文件,执行时需要把代码段、数据段、堆栈段等重新定位,然后才能执行,装入执行速度相对较慢。 .COM或.EXE文件装入内存时都会产生一个256字节的程序段前缀PSPProgram Segment Prefix,包含程序运行的根本信息,存放在程序开始的0FFH处,具体格式如下:霹障蛰儡衰宗镶劈硕米峰捏茂档药检匈从材仑鳃裁准血狂锄肄蚂力伴某腺第4章 汇编语言第4章 汇编语言格式化参数2,给未打开的FCB用16 +6CH保留4 +7CHDOS专用,前两字节为环境块地址48 +2CH格式化参数1,给未打开的FCB用16 +5CH非

4、格式化参数或默认磁盘传输地址128 +80H保留22 +16H标准错误出口地址(INT 24H)4 +12HCTRL_BREAK中断出口地址(INT 23H)4 +0EH保留DOS功能调用入口(同INT 21H)运行终止处理程序地址(INT 22H)154 +4H +5H +0AH可用内存空间,以小段为单位2 +2H指令INT 20H,终止程序2PSP+0H字段说明字段长度字段偏移程序段前缀说明PSP+0H处存放了一条指令,是用于结束程序的DOS中断,即INT 20HPSP+2H处是程序可用的内存空间,以小段为单位,每小段为16字节PSP+5H处是DOS功能调用INT 21H的入口地址。PSP

5、+0AH0DH是INT 22H的入口IP和CSPSP+0EH11H是INT 23H的入口IP和CSPSP+12H15H是INT 24H的入口IP和CSPSP+2CH处是环境块地址统殉渠越硝值虱影迹瑶桌寨稻储踞城端呻幂呐针符朔到恶廖娟绕横埠郁诈第4章 汇编语言第4章 汇编语言汇编语言介绍参数传递 早期的DOS支持格式化参数,例: COPY A:file1.asm C:file2.asm将A:file1.asm格式化参数1存于PSP+5CH处,格式为:将B:file2.asm格式化参数2存于PSP+6CH处非格式化参数存于PSP+80H处012345678910111FILE1ASM姓驳莫酸氖背洱

6、迈缝倚关迸讯烹歉摩雪淡拂惜惰著颓负腐敞鄙叶倪竞启垂第4章 汇编语言第4章 汇编语言汇编语言格式五. 汇编语言格式1. 段的定义:由SEGMENT和ENDS定义段seg_name SEGMENT align_type combine_type class; 中的参数为可选参数seg_name ENDS例:data1 segment para public data ;数据段定义 string db Hello!, 7, $ data1 ends1段名seg_name代表了所定义段的起始地址2align_type 说明该段起始位置在内存中的对齐类型para 指定该段从一个小段(16字节的边界开始;

7、byte 指定该段从任一位置开始;word 指定该段从一个字边界开始page 指定该段从一个页(256字节)的边界开始政京芽坦瓣酵痊墒肮迫渡扒棍妊埔幕抒足箔刘令补衬绕傍杭坚聪柞姻坛涛第4章 汇编语言第4章 汇编语言汇编语言格式3) combine_type 指出不同程序模块中具有相同段名的分段的连接类型public 表示该段在连接时,将与有相同名字的其他分段连接在一起,且仅有一个起始地址;common 表示该段连接时将与其他同名分段重叠,也只有一个起始地址,不同分段会产生覆盖;stack 表示该段是堆栈段,连接时不同模块中的堆栈段连接在一起4) class 类别,连接时用于组成段组名 当连接两

8、个源模块时,具有相同class名的两个段在存储器中的位置是紧靠在一起的,但两个段并不会合并成一个段。害婿歹矿朽拙剧拣嫉嫩旱铸刃为阂犯醋驻柒滑拍螺涕刀伞俏拴弗筹稼祷冉第4章 汇编语言第4章 汇编语言汇编语言格式例1 combine_type 连接类型举例,两个模块定义如下;source module1;source module2data_seg segment commondata_seg segment common data_seg endsdata_seg endsss_seg segment stackss_seg segment stack dw 20 dup ( ? )dw 30

9、dup ( ? )ss_seg endsss_seg endscode_seg segment publiccode_seg segment public code_seg endscode_seg ends 两个模块独立编译,再一起连接,最后形成的装入模块的存储区分配情况如下所示:缅龟位悔漳掺慰伙吭潞这脾均真窟赘伟饵帕侣妄啪袄奸仆棺辛倦洞李皆富第4章 汇编语言第4章 汇编语言汇编语言格式data segmentcode segmentstack segment栈顶位置50个字模块1的代码模快2的代码模块连接内存分配情况图宽醋督护倡霹斗祝砂拂廊辽下侠攒安胃沾镐雀烦勉猩渗概繁炯饮锯享您此第4章

10、汇编语言第4章 汇编语言汇编语言格式例2 class 类别举例,两个模块定义如下;source module1 两个模块独立编译,统一连接,data1 segment data 形成的装入模块的存储区分配情况 如以下图所示:data1 endscode1 segment code code1 ends;source module2data2 segment data data2 endscode2 segment code code2 endsdata1data2模块1数据段模块2数据段data1段起始地址data2段起始地址code1code2模块1数据段模块2数据段code1段起始地址co

11、de2段起始地址陈扶缄绪气偷早让万匆溜刑魁蜒贞投偿人瑰缮坪壬戚臂踩齿沿赘配目战祖第4章 汇编语言第4章 汇编语言汇编语言格式2. 过程子程序的定义:由PROC和ENDP定义过程例: main proc far sub1 proc near call sub1 ret main endp sub1 endp1) far / near,过程类型说明符近过程:属于段内调用,near可省略远过程:属于段间调用,主程序必须定义为远过程2过程名代表了一个子程序的起始地址入口地址3. assume 指示了段与段存放器之间的对应关系,但并不将段名所代表的段起始地址赋给段存放器,具体赋值应在程序中完成例:my_

12、code segment ;代码段定义 assume cs: code1, ds: data1, ss: ss_stackmain proc far main endp使用格式 assume 段存放器名:段名痘岗仙囚风冉圈碾摄削沁放干懊矩疼穴或萎古桩追私汀邱愈茎认筹缆蓝馁第4章 汇编语言第4章 汇编语言汇编语言标记六. 汇编语言中的标记1. 变量名 var db 10 ;变量名代表了所分配存储单元的起始地址2. 标号 AAA: MOV al, 1 ;标号代表了所跟指令的起始地址3. 过程名 sub1 proc ;过程名表示了程序的起始地址(入口地址) sub1 endp4. 段名 data1

13、segment ;段名表示了所定义段的起始地址 data1 ends说明: 1汇编语言中的标记不能以数字开头,但数字可以出现在标记名中间 2以上标记所代表的地址应包括2个属性:偏移地址和段地址 3变量名、过程名还包括第3个属性:即相应的类型 变量名代表的类型为:DB DW DD等 过程名代表的类型为:far near 嚣是剃运侈效蔗剪拔独艰莲腻暗涕匆伟涯照蔚友篙叹源吟陶挺盯恼狱吴涂第4章 汇编语言第4章 汇编语言汇编语言伪指令七. 伪指令 常用ASM-8086伪指令如下:1. 数据定义伪指令:DB、DW、DD、DQ、DT 分别以字节、字、双字、8个字节、10个字节为单位定义数据,例: var

14、dw 100H, 200H ;表示以字为单位定义2个数据 str db Hello;给出带单引号的字符等于给出了字符的ASCII码 addr1 dw str ;将变量str所代表的偏移地址赋给变量addr1 addr2 dd str;将变量str所代表的偏移地址和段地址赋给addr22. 偶地址对齐伪指令:EVEN 用于判断当前存储单元是否为偶地址,假设是那么无操作,否那么让下一个数据或代码从偶地址开始存放3. 指定起始位置伪指令:ORG ORG 20H;指定下一个数据或代码从0020H开始存放4. 重复表达式伪指令:DUP buf db 10 dup(?) ;表示以字节为单位定义数据,重复1

15、0次,即定义10 个数据,表示重复的内容,?表示只分配存储单元,但不赋初值炳略无毙屡丈索琐恕窝碎龟蚂硒腕足膳光巡郭哑谬幢斜迪势隆怨歪阐营呜第4章 汇编语言第4章 汇编语言汇编语言伪指令5. 赋值伪指令:EQU 类似于C语言中的define,不分配存储单元 AAA EQU 10 ;以符号AAA表示数据10,编译时把程序中所有出现 ;AAA的地方用10替换,也可用 AAA = 10 表示 BBB EQU AAA ;用符号BBB表示另一个符号AAA6. 段定义及程序定义伪指令:segment/end proc/endp far/near7. 程序结束伪指令:END 表示整个程序结束8. 类型说明伪指

16、令:byte ptr, word ptr, dword ptr, near ptr,far ptr9. 其他伪指令:OFFSET;析取变量、标号和过程名的偏移量SEG;析取变量、标号和过程名的段地址TYPE;析取变量、标号和过程名的类型取值:DB 1, DW 2, DD 4, DQ 8, DT 10,NEAR -1, FAR -2莱霞塔残物私缓思渍戏钢架命职椿叉婶砌恳卯怜邵假滞祖谆佳匡影袖滨客第4章 汇编语言第4章 汇编语言返回操作系统方法主程序退出返回操作系统的三种方法 A、利用INT 20H结束程序 code segment main proc far int 20h main endp

17、code ends end mainB、利用DOS功能调用4CH退出code segment main proc far mov ax, 4C00h int 21h main endpcode ends end mainC、利用程序段前缀PSP返回code segment main proc far push ds xor ax, ax;将AX清0 push ax ret main endpcode ends end main 程序装入内存后,系统将CS:IP、SS:SP分别指向代码段和堆栈段起始位置,而DS、ES指向PSP+0处,程序结束时,RET指令返回PSP+0H处执行INT 20H指令

18、,释放程序占用的存储器空间,并返回操作系统。芬刁当础光直古澡斩裂泰肯绷砸附霉伙梗茂悯花喇身碑需夸彝搏递央贺哮第4章 汇编语言第4章 汇编语言汇编语言程序设计第4.2节 汇编语言程序设计常用DOS功能调用 通常把DOS提供的INT 21H中断效劳程序称为DOS功能调用,调用时根据AH的值来选择子功能。AH=1 键盘键入并回显, 输入字符的ASCII码在AL中返回 例: MOV AH, 1 INT 21HAH=2 显示输出字符,输出字符的ASCII码放入DL中 例: MOV AH, 2 MOV DL, A INT 21HAH=7 键盘输入无回显,输入字符的ASCII码在AL中返回 例: MOV A

19、H, 7 INT 21H搞优扼宏驮港矢叶奸烫臻宽维羽洁摄晃征暂左秘志核馏县梦依吧缉丧着搂第4章 汇编语言第4章 汇编语言DOS功能调用AH=9 显示字符串,字符串以$结束,开始位置用DS: DX指示 例: MOV AX, MY_DATA MOV DS, AX LEA DX, String MOV AH, 9 INT 21HAH=4C 程序运行结束,返回操作系统,返回码由AL给出 例: MOV AX, 4C00H INT 21H 程序设计实例包括6局部顺序结构程序设计分支结构程序设计循环结构程序设计子程序设计字符串程序设计数码转换程序设计孕讲贱歼想掷些平刷叉矾漾孟蕊傍诈吊犁锤骑活栓具傻趴钧戒予誓

20、填酵黍第4章 汇编语言第4章 汇编语言顺序结构程序设计顺序结构程序设计例1 从键盘输入一个小写字母,转换成大写字母输出 data segment para str1 db Please input ( a z ): $ str2 db 0dh,0ah,The result is: $data endsss_seg segment stack dw 100 dup(0)ss_seg endscode segmentassume cs:code, ss:ss_seg, ds: data main proc farmov ax, data ;对数据段赋值mov ds, axlea dx, str1

21、;ds:dx指向str1mov ah, 9 ;显示提示符1int 21h mov ah, 1 ;输入小写字符 int 21h sub al, 20h ;得到大写字母ASCII push ax ;放入堆栈保存 lea dx, str2 ;ds:dx指向str2 mov ah, 9 ;显示提示符2 int 21h pop ax ;从堆栈恢复AX值 mov ah, 2 ;输出大写字符 mov dl, al int 21h mov AX, 4c00h;返回DOS int 21h main endpcode ends end maina z 61H 7AHA Z 41H 5AH羊扶遂肥路旅络琼遗会驱稳拜

22、崇沛渺额剐娩沛调莫盒击萧柱伏或撮鹰淌愉第4章 汇编语言第4章 汇编语言顺序结构程序设计例2 以16进制形式显示存储器中一个字节的无符号数VAR, 例: 1101 0101 显示 D5 方法:将一个字节分为高4位和低4位,先显示高4位,后显示低4位,data segment para vardb 100data endsss_seg segment stack dw100 dup(0)ss_seg endscodesegment assume cs:code, ds:data, ss:ss_seg main proc far mov ax, data mov ds, ax mov al, var

23、mov dh,almov cl,4 shr al, cl call bin2asc call pchar mov al, dh call bin2asc call pchar;显示al中一个字符 pchar proc mov ah, 02h mov dl, al int 21h ret pchar endpcode ends end main mov ax, 4c00h int 21hmain endpbin2asc proc and al, 0fh add al, 30h cmp al, 9 jbe asc1 add al, 7asc1: retbin2asc endp;将AL的低4位转换;

24、为ASCII码洼杠抹蒋抑呸罗缎蒋洲险刹琶裤邢般瓣沮嫁夸旗弛淋克饶苏酶詹阿朝僳矫第4章 汇编语言第4章 汇编语言顺序结构程序设计例3 从键盘输入15之间的一个数,在屏幕上显示onefive。 如输入5,那么显示fivedata segment para str1db one, $str2db Two, $ str3db Three, $ str4db four, $ str5db five, $ tab dw str1,str2,str3,str4,str5data endsssg segment stackdw 256 dup(?)ssg endscode segment paraassume

25、 cs:code,ss:ssg,ds:datamain proc farmov ax, datamov ds, axmov ah, 1 ;键盘输入int 21hcall asc2bin mov bl, almov bh, 0dec bxshl bx, 1mov dx, tabbxmov ah, 9int 21hmov ax, 4c00hInt 21h main endp;将ASCII转换为二进制数;入口:AL存放ASCII;出口:转换后数值在ALasc2bin procsub al, 30hcmp al, 9jbe nextsub al, 7next: retasc2bin endpendma

26、in舞闭茂床爽赫纷回幻阳卿微醉茨那喻华少菜倍娃徐音诀廖诚儿触住擒辨嘶第4章 汇编语言第4章 汇编语言分支结构程序设计分支结构程序设计二分支结构例4 在数据段中有两个16位二进制无符号数data1和data2,找出其中较小数,并存于MIN中data segment data1 dw 2000h data2 dw 3f80h min dw ?data endsss_seg segment stack dw 100 dup(0)ss_seg endscode segment assume cs:code, ds:data, ss:ss_seg main proc far mov ax, data m

27、ov ds, ax mov ax, data1 cmp ax, data2 jb next mov ax, data2next: mov min, ax mov ax, 4c00h int 21h main endpcode ends end main骑舍荚羔畏滁垄析柱词纤戈寻羌品兵落操般郸贰蟹尔烃翰锋聂篇锐循睁狄第4章 汇编语言第4章 汇编语言分支结构程序设计三分支机构例5 判断16位有符号数var的值,假设为正数,在result中存入1;为负数,在result中存入-1;为零,在result中存入0data segment var dw 2000h result dw ?data ends

28、ss_seg segment stack dw 100 dup(0)ss_seg endscode segment assume cs:code, ds:data, ss:ss_seg mainproc far mov ax, data mov ds, ax mov ax, var cmp ax, 0 jl less jg great ;mov ax, 0 jmp nextless: mov ax, -1 jmp nextgreat: mov ax, 1next: mov result, ax mov ax, 4c00h int 21h main endpcode ends end main赴

29、溺织怨夕宏牲审沦蹦奔雷蝶桩尧春雍饼曼豹击仗呻螺耕肆溢明枉叁疯筷第4章 汇编语言第4章 汇编语言分支结构程序设计多分支机构例6 根据字节变量var被置位的情况控制程序转移到8个子程序中的一个data segment tab dw subr1, subr2, subr3, subr4 dw subr5, subr6, subr7, subr8 var db 04hdata endsss_seg segment stack db 100 dup(0)ss_seg endscode segmentassume cs: code, ds: data, ss: ss_seg main proc farmo

30、v ax, data mov ds, ax mov al, var cmp al, 0 jz exit movbx, 0getbit: shr al, 1 jc subr add bx, 2 jmp getbitsubr: call tabbxexit: mov ax, 4c00h int 21h main endp subr1 proc ret subr1 endp subr8 proc ret subr8 endpcode ends end main 变量var子程序0000 0001subr10000 0010subr20000 0100subr30000 1000subr40001 0

31、000subr50010 0000subr60100 0000subr71000 0000subr8政阅哲牢迄超晋致睦怎借凯汐乖茎匝虐能莹素懦哮事齐址蔑严虏情穷矿囱第4章 汇编语言第4章 汇编语言循环结构程序设计循环程序设计单重循环例7 以buf单元开始存放8个16位有符号数 请找出最大数存于max单元data segment buf dw -10, 300, 528, 222 dw 426, 923, 223, -36count equ ($-buf) / 2 max dw ?data endsss_eg segment stack dw 100 dup(0)ss_seg endscode

32、segment assume cs:code, ds:data, ss:ss_seg main proc farmov ax, data mov ds, axmov cx, count-1mov bx, 0mov ax, bufbxcircle: addbx, 2cmp ax, bufbxjge nextmovax, bufbx next: loop circlemov max, axmov ax, 4c00hint21h main endpcode ends end main白遣量律衫经滞檬潘乾屁摔炭鲍尿愤澈鸳闻据桅感悼脯画基箕柱哉芦宦臻第4章 汇编语言第4章 汇编语言循环结构程序设计例8

33、将5个有符号字节数相加,结果保存在sum中data segment para bufdb -100, 127, 112, 99, -10 sum dw 0data endsss_seg segment stack dw 100 dup(0)ss_seg endscode segment para assume cs:code, ss:ss_seg, ds: datamain proc farmovax, data movds, axmovcx, 5mov dx, 0 movbx, 0circle:mov al, bufbxcbw;字扩展, ALAX adddx, ax;16位加法, 防止溢出i

34、ncbxloopcirclemovsum, dxmovax, 4c00hint21h main endpcode endsend main斗狞仅摆捕匹秤袜桥胯见刹矫荔月坐亨橇窄敲计磨使篓我酣沦映壤生默算第4章 汇编语言第4章 汇编语言循环结构程序设计多重循环举例:冒泡法排序例9 以buf单元开始连续存放10个16位有符号数,请按由小到大排序data segment buf dw -10, 30, 52, 2, 92 dw 22, -36, -31, 63, 44 countequ ($-buffer) / 2data endsss_seg segment stack dw 100 dup(0)

35、ss_seg endscode segmentassume cs:code, ds:data, ss:ss_seg main proc farmov ax, datamov ds, axmov cx, count - 1circle1: movbx, 0 ;外循环pushcxcircle2:movax, bufbx ;内循环cmpax, bufbx+2 ;比较数据jlenextxchgax, bufbx+2 ;交换数据movbufbx, axnext:addbx, 2loopcircle2 popcxloopcircle1movax, 4c00hint21h main endpcode end

36、sendmain碘扁魄睡躇较颖耘戴忻歉咯见冻苑救瞪臼貉启镰蚜商插狮奥耪孵见口瓜柜第4章 汇编语言第4章 汇编语言循环结构程序设计冒泡法第二种实现data segment buf dw -10, 30, 52, 2, 92 dw 22, -36, -31, 63, 44 countequ ($-buffer) / 2data endsss_seg segment stack dw 100 dup(0)ss_seg endscode segmentassume cs:code,ds:data,ss:ss_seg main proc farmov ax, datamov ds, axmov cx,

37、count - 1circle1: movbx, 0movdx, 0pushcxcircle2:movax, bufbx cmpax, bufbx+2 jlenextxchgax, bufbx+2 movbufbx, axmovdx, 1;表示发生交换next:addbx, 2loopcircle2 popcxcmpdx, 0jzexitloopcircle1 exit: mov ax, 4c00h int 21h main endp code ends end main坪奸痒炙贴码脐砍徐届灿镶组颐熟虏象呈碍均指译饶落垛尔进埂泌希藏霄第4章 汇编语言第4章 汇编语言子程序设计子程序设计 如何进

38、入子程序,如何返回调用程序调用时:CALL TAGET ;将返回地址压入堆栈返回时:RET ;从堆栈中弹出返回地址赋给CS和IP子程序中使用堆栈,应保持动态平衡 子程序参数传递方法存放器传递全局变量传递堆栈传递代码段传递 子程序描述子程序功能描述入口参数描述出口参数描述区舅刑簇绝运坤榴邮硼埂又固稻爹生轧武蹿源智字涉没挠天帜茸彪该届氯第4章 汇编语言第4章 汇编语言子程序设计1. 存放器传递参数;将 0 F 转换为ASCII码;入口参数: 要转换的数值放入AL低4位;出口参数:转换后的ASCII放入AL返回 moval, 3callbin2ascbin2asc proc and al, 0FH

39、add al, 30H cmp al, 9 jbe asc1 add al, 7asc1: retbin2asc endp2. 全局变量传递参数;将2个无符号字数据相加x dw ? y dw ? ;调用前将参数赋给全局变量movx, 8movy, 7calladd_sradd_sr proc movax, xaddax, yret ;返回时,结果在AL中add_sr endp畸徘轰位趴语凹招逐腺桂仔坎司烙爷照监法半仙很藐歧意老膀匪帧暴笔隐第4章 汇编语言第4章 汇编语言子程序设计3. 堆栈传递参数 高级语言多采用该方法例:将2个无符号字数据相加;调用前将参数压入堆栈mov ax, 8push

40、axmov ax, 7push axcall add_sr;子程序中如何访问堆栈中参数?; BP 间接寻址 默认堆栈段add_sr proc push bp mov bp, sp mov ax, bp+6 ;8 add ax, bp+4 ;7 pop bp ret 4 ;返回后,将SP+4,保;持堆栈平衡add_sr endp煤班塌丰燎秧塔弛井耕上疡扫峙纠用蛮祭筷贝耐镍成嘉陌述款湖怜辟阻吉第4章 汇编语言第4章 汇编语言子程序设计4. 代码段传递参数例10 在数据段中有一个16位二进制无符号数var,计算var*10+600的值, 并把结果存于result单元中,试编程。data segmen

41、t var dw 32767 result dd ?data endsssg segment stack dw 100 dup(?)ssg endscode segment assume cs:code,ds:data,ss:ssgstart proc far mov ax, data mov ds, axmov ax, varcall funcA:dw 10dw 600B:lea bx, resultmov bx, axmov bx+2, dxmov ax, 4c00h int 21hstart endpfunc proc push bp mov bp, sp push si push bx

42、 mov bx, bp+2 mov si, cs:bx ;10 mul si ;var*10 add ax, cs:2bx ;600 adc dx, 0 add bx, 4 mov bp+2, bx pop bx pop si pop bp ret func endpcode ends end start磐剧髓怪逮卤遵纬挝映庶宗司远腿糕等磊匙乡斋掀京耙狂研窄猎勉材摇厌第4章 汇编语言第4章 汇编语言字符串程序设计字符串程序设计例11 显示一个字符串,结束符为NULL字符data segment str1 db Welcome! , 0data endsssg segment stack dw

43、100 dup(0)ssg endscode segmentassume cs:code,ds:data,ss:ssg main proc far mov ax, data mov ds, ax lea si, str1 call pstr mov ax, 4c00hmov ax, 4c00h int 21hmain endppstr proc cldpstr1: lodsb ;从串中取字符 cmp al, 0 ;判断结束符 jz pstr2 call pchar ;显示字符 jmp pstr1pstr2: retprtstr endppchar proc mov ah, 02h mov dl

44、, al int 21h retpchar endpcode ends end main洛铀追俭选徐坡辟萨落的定掘滩谗瘟坪惰营腺恳省才于稚芦桩舀琼倡片仰第4章 汇编语言第4章 汇编语言字符串程序设计例12 拷贝字符串strcpy.asm,把字符串str1拷贝到字符串str2 ;入口: si存放str1起始地址, di存放str2起始地址 ;出口: str1内容被拷贝到str2,ax为str2起始地址strcpy proc mov ax, ds mov es, ax movdi, dx ;es:di指向串2 mov dx, di ;保存串2地址 repmovsb mov di, si ;es:d

45、i指向串1 movax, dx xor al, alret mov cx, 0ffffh strcpy endp cld repnz scasb not cx ;cx为含0源串长度碰暇畦檬拟跌雀彰坦伺她唤粹晦簿捧儡寓精杆衍隅鞘歹痪白憾荚任佛吗敬第4章 汇编语言第4章 汇编语言数码转换程序设计数码转换程序设计1. 二进制转换为十进制ASCII码例13 以10进制格式显示一个无符号字数据分析: 1) 存储时用二进制,书写时用16进制或10进制 如:127 存储:0111 1111b 书写:7FH 2二进制如何转换为10进制,即得到万位、千位、个位 如:127,每次除以10,保存余数 7 37H2

46、32H 1 31H 注:09 30H39H 3显示时,使用ASCII码, AH=2 DOS功能调用输出字符雇辜坊萄娥节摊褒专港萝厩扩阀斑补绥巫底玲贴之蟹救溪堤猿纶达萤摧孟第4章 汇编语言第4章 汇编语言数码转换程序设计var dw 7FH;数据定义buf db 5 dup( ) ;初始化为空格 mov bx, 4mov si, 10mov dx, 0 mov ax, vardiv si ;(DX,AX) / 10add dl, 30h ;得到个位 mov bufbx, dl;mov dx, 0 div si add dl, 30h;得到十位dec bx mov bufbx, dl;mov dx

47、, 0div si add dl, 30h ;得到百位dec bx mov bufbx, dl ;可继续得到千位、万位;显示十进制数mov bx, 0mov dl, bufbxmov ah, 2int 21h;显示万位;inc bxmov dl, bufbx mov ah, 2int 21h ;显示千位 .孤酣锗酿节而狱订贸眨计瘟自圈移服钟菩然骤址对媳叮严碉修诸萨趁蔡佐第4章 汇编语言第4章 汇编语言数码转换程序设计circle1:movdx, 0divsi ;除以10adddl, 30hmovbufbx, dldecbxloopcircle1movcx, 5 ;显示5位数据movbx, 0c

48、ircle2:movdl, bufbxmovah, 2int21hloopcircle2movax, 4c00hint21h main endpcode ends end main 优化后的完整汇编程序data segment var dw 7F00H buf db 5 dup ( ) data ends ssg segment stack dw 100 dup(0)ssg endscode segmentassume cs:code,ds:data,ss:ssgmain proc far mov ax, data mov ds, ax mov cx, 5 mov bx, 4 mov si,

49、10 mov ax, var熄渣朗亚室匝蚀潜嚏击咆鞠画戮死千镣芥寂奥哄心圾睁广玖咀执腿撕忠炭第4章 汇编语言第4章 汇编语言数码转换程序设计例14 以10进制格式显示一个有符号字数据data segment dat dw 900Ah buf db 6 dup ( ) data ends ssg segment stack dw 100 dup(0)ssg endscode segmentassume cs:code,ds:data,ss:ssgmain proc far mov ax, data mov ds, ax mov buf , + cmp var, 0 jge next mov bu

50、f, - neg varnext: mov cx, 5 mov bx, 5 mov si, 10 mov ax, varcircle1: mov dx, 0 div si add dl, 30h mov bufbx, dl dec bx loop circle1 mov cx, 5 mov bx, 0circle2: mov dl, bufbx mov ah, 2 int 21h inc bx loop circle2 mov ax, 4c00h int 21h main endp code ends end main蜡致哭麓共波钩祈镭该郝肪擎俞焚讼旱弟胳刹兵融球乔竞胀痕失州无坞佰第4章 汇编

51、语言第4章 汇编语言数码转换程序设计2. BCD码转换为二进制数例15 将一个位压缩BCD码数,转化为二进制数分析:var dw 1024H 看作压缩BCD码,表示十进制数,大小应为 1024 因此转换成二进制数后,在存储器中应该存放为 0400H方法:转换后数据 = 千位*1000 + 百位*100 + 十位*10 + 个位 采用循环实现 数据 = (千位*10 + 百位)*10 + 十位)*10 + 个位 数据 = (BCD3*10+ BCD2)*10 + BCD1)*10 + BCD0 1024 = (1H * 10 + 0H) * 10 + 2H) * 10 + 4H 第1次: ax = 1H * 10 + 0H 第2次: ax = ax * 10 + 2H 第3次: ax = ax * 10 + 4HBCD1BCD0BCD3BCD2var低8位高8位谜眩谗芹症嚼妥啼断槛蚀管纽酥秉练札搐痹剿士姆涣寄榨煤漏只汲谩梗驱第4章 汇编语言第4章 汇编语言数码转换程序设计 mov ax, 0cirlce: mul si ;乘以10 rol var

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论