汇编语言程序设计课后习题解答宋人杰2版

更新时间:2024-05-27 12:26:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第1章 汇编语言基础知识

1.简述汇编语言源程序、汇编程序、和目标程序的关系。

答:用汇编语言编写的程序称为汇编源程序;汇编源程序在汇编程序的翻译下转换成计算机语言变成目标程序。

2. 简述汇编语言的优缺点。 答:(1) 汇编语言的优点:

① 可有效地访问、控制计算机各种硬件设备,如磁盘、存储器、CPU、

I/O端口等。.

② 目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。 ③ 可与高级语言配合使用,应用十分广泛。 (2) 汇编语言的缺点:

① 通用性和可移植性较差

② 相对于高级语言来说较繁锁、易出错、不够直观。

3.CPU的寻址能力为8KB,那么它的地址总线的宽度为多少? 答:13

4. 1KB的存储器有多少个存储单元? 答:1024个字节。

5. 指令中的逻辑地址由哪两部分组成?

答:指令中的逻辑地址由段基址和偏移量组成。

6. 以下为用段基址:偏移量形式表示的内存地址,试计算它们的物理地址。 (1) 12F8:0100 (2) 1A2F:0103 (3) 1A3F:0003 (4) 1A3F:A1FF 答: (1) 13080H (2) 1A3F3H (3) 1A3F3H (4) 245EFH

7. 自12FA:0000开始的内存单元中存放以下数据(用十六进制形式表示): 03 06 11 A3 13 01,试分别写出12FA:0002的字节型数据、字型数据及双字型数据的值。

答: 字节型数据:11H 字型数据:0A311H

双字型数据:0113A311H

8. 内存中某单元的物理地址是19318H,段基地址为1916H,则段内偏移地址为多少?若段内偏移地址为2228H,则段基地址为多少? 答:若段基地址为1916H,则段内偏移地址为01B8H;若段内偏移地址为2228H,则段基地址为170FH

9. 在实模式环境中,一个段最长不能超过多少字节? 答:64KB

10. 实模式可寻址的内存范围是多少? 答:1MB

第2章 汇编语言源程序格式

1.请解释变量和标号的含义,两者有何区别?

答:标号代表一条指令所在单元的地址,在代码段中定义;变量是存放数据的存储单元的地址符号名,在除代码段以外的其他段中定义。变量和标号的主要区别在于变量指的是数据,而标号则对应的是指令。 2. 变量和标号有什么属性?答:都具有三种属性:段属性、偏移属性和类型属性 3. 伪指令语句与指令语句的区别是什么?伪指令有什么用途?

答:伪指令并不像指令语句那样在程序运行期间由计算机自动执行,而是在汇编程序对源程序汇编期间由汇编程序处理的操作。伪指令可以完成如处理器选择、定义程序模块、数据定义、存储区分配、指示程序开始和结束等功能。 4. 数值返回运算符有哪几种?简述LENGTH和SIZE的区别。 答:⑴数值返回运算符包括:SEG(取段地址)、OFFSET(取偏移地址)、TYPE(取类型值)、LENGTH(取长度)、SIZE(取总字节数)。⑵对于变量中使用DUP的情况,LENGTH回送分配给该变量的单元数,对于其他情况则送1;而SIZE会送分配给变量的总字节数,也就是LENGTH和TYPE的乘积。 5. 画图说明下列伪指令所定义的数据在内存中的存放形式。 (1) ARR1 DB 6,34H,-7 (2) ARR2 DW 3C5DH,1,?

(3) ARR3 DB 2 DUP(1,2,DUP(2,5),3) (4) ARR4 DB ‘HELLO’ (5) ARR% DB ‘1234’ 答:(1) 见题图2.1

ARR106H34HF9H

题图2.1

(2) 见题图2.2

ARR25DH3CH01H00H- -- -

题图2.2

(3) 见题图2.3

ARR301H02H05H02H05H03H01H02H05H02H05H03H

题图2.3

(4) 见题图2.4

ARR448H45H4CH4CH4FH

题图2.4

(5) 题图2.5

ARR531H32H33H34H

题图2.5

6. 写出下列变量定义语句。

(1) 为缓冲区BUF1预留20B的存储空间。

(2) 将字符串‘ABCD’,‘1234’存放于BUF2存储区中。 答: (1) BUF1 DB 20 DUP(?) (2) BUF2 DB ‘ABCD’ DB ‘1234’ 7. 符号定义语句如下:

BUF DB 2,3,4,5,‘345’ EBUF DB 8

LT DB EQU EBUF-BUF 问LT的值是多少? 答:LT的值为7

8. 假设程序中的数据定义如下: A DW ?

B DB 16 DUP(?) C DD ? T EQU $-A

问T的值是多少?它表示什么意义?

答:T的值是22;它表示从变量A到T之间分配的存储空间(字节)数目。 9. 如何规定一个程序执行的开始位置?主程序执行结束应该如何返回DOS?源程序在何处停止汇编过程?

答:程序开始位置:END伪指令后的标号所对应的地址;应用程序开始伪指令.STARTUP处。

返回DOS:RET指令结合PUSH DS等指令;用DOS功能调用的第4CH号中断;.EXIT伪指令。

END伪指令处停止汇编过程。

10.EQU伪指令与“=”伪指令有何区别? 答:在同一程序中,“=”伪指令可对一个符号重复定义 11.指出下列伪指令表达方式的错误,并改正之。 (1) DATA SEG

(2) SEGMENT ‘CODE’ (3) MYDATA SEGMENT ┇

DATA ENDS

(4) MAIN PROC FAR ┇

END MAIN MAIN ENDP

答:(1) SEG改为SEGMENT (2) 没有段名

(3) DATA ENDS改为MYDATA ENDS (4) END MAIN删除

第3章 8086/8088寻址方式及指令系统

1.什么是寻址方式,8086/8088微处理器有几种寻址方式,各类寻址方式的基本特征是什么?

答:寻址方式就是寻找指令中操作数的方式,或寻找指令转移目的地址的方式。 8086/8088微处理器的寻址方式分为数据寻址方式和程序转移寻址方式。数据寻址方式主要包括立即数寻址方式、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址变址寻址方式和相对基址变址寻址方式;程序转移寻址方式主要包括段内直接寻址、段内间接寻址、段间直接寻址、段间间接寻址。

立即数寻址:操作数就在指令中,作为指令的一部分,跟在操作码后存放在代码段。

寄存器寻址:操作数在寄存器中,指令中指定寄存器号。

直接寻址方式:操作数在存储器中,指令直接包含操作数的有效地址EA。 寄存器间接寻址:操作数在存储器中,操作数的有效地址在SI,DI,BX,BP这4个寄存器之一中。

寄存器相对寻址:操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)或变址寄存器(SI,DI)的内容加上8位或16位的位移之和。

基址变址寻址:操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)加上变址寄存器(SI,DI)的内容。

相对基址变址寻址:操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)和变址寄存器(SI,DI)的内容加上8位或16位的位移之和。

段内直接寻址:转向的有效地址是当前IP寄存器的内容和指令中指定的8位或16位位移量之和。

段内间接寻址:转向的有效地址是一个寄存器或是一个存储单元的内容。 段间直接寻址:在指令中直接提供了转向段地址和偏移地址。

段间间接寻址:用存储器里的两个相继字的内容来取代IP和CS寄存器中的原始内容,以达到段间转移的目的。

2. 假定(DS)=1000H,(SI)=007FH,(BX)=0040H,(BP)=0016H,变量TABLE的偏移地址为0100H,试指出下列指令的源操作数字段的寻址方式,它的有效地址(EA)和物理地址(PA)分别是多少?

(1) MOV AX,[1234H] (2) MOV AX,TABLE

(3) MOV AX,[BX+100H] (4) MOV AX,TABLE[BP][SI] 答:(1) 直接寻址,EA=1234H,PA=11234H (2)直接寻址,EA=0100H,PA=10100H (3) 寄存器相对寻址,EA=0140H,PA=10140H(4)相对基址变址寻址,EA=0195H,PA=10195H

3. 若TABLE为数据段0032单元的符号名,其中存放的内容为1234H,试问下列两条指令有什么区别?执行完指令后,AX寄存器的内容是什么? MOV AX,TABLE LEA AX,TABLE

答:第一条指令是取0032单元的内容,执行完后AX的内容是1234H 第二条指令是取TABLE的偏移地址,执行完后AX的内容为0032H 4. 指出下列指令的错误。

(1) MOV CX,DL (2) MOV IP,AX (3) MOV ES,1234H (4) MOV ES,DS (5) MOV AL,300H (6) MOV [SP],AX (7) MOV AX,BX+DI (8) MOV 20H,AH

答:(1) 两操作数长度不一致 (2) 目的操作数不能为IP

(3) 立即数不能直接送段寄存器

(4) 两个段寄存器之间不能直接进行数据传送 (5) 两操作数长度不一致 (6) SP不能用作间址寄存器

(7) BX+DI改为[BX][DI]或[BX+DI] (8) 目的操作数不能为立即数 5. 指出下列指令的错误。 (1) POP CS

(2) SUB [SI],[DI] (3) PUSH AH (4) ADC AX,DS

(5) XCHG [SI],30H (6) OUT DX,AH (7) IN AL,3FCH (8) MUL 5

答:(1) POP指令不允许使用CS

(2) 两操作数不能同时是存储器寻址方式 (3) 堆栈的操作必须以字为单位 (4) 段寄存器不允许直接参加运算

(5) XCHG指令的操作数不允许是立即数 (6) OUT指令只能用AL做源操作数

(7) 端口号大于255,必须将其放到DX中 (8) MUL指令源操作数不允许是立即数 6. 请分别用一条汇编语言指令完成如下功能。

(1) 把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。

(2) 用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存

器的内容相加,并把结果送到AL中。

(3) 用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和

CX寄存器的内容相加,并把结果送回存储器中。

(4) 把数0A0H与AL寄存器的内容相加,并把结果送回AL中。 答:(1)ADD DX,BX

(2)ADD AL,[BX+SI] (3)ADD [BX+0B2H],CX (4)ADD AL,0A0H

7. 求出以下各十六进制数与十六进制数58B0之和,并根据结果设置标志位SF、ZF、CF和OF的值。 (1) 1234H (2) 5678H (3) 0AF50H (4) 9B7EH

答:(1)和为6AE4H,SF=0,ZF=0,CF=0,OF=0 (2)和为0AF28H,SF=1, ZF=0, CF=0, OF=1 (3)和为0800H, SF=0, ZF=0, CF=1, OF=0 (4)和为0F42EH, SF=1, ZF=0, CF=0, OF=0

8. 执行指令ADD AL,72H前,(AL)=8EH,标志寄存器的状态标志OF、SF、ZF、AF、PF和CF全为0,指出该指令执行后标志寄存器的值。

答:指令执行后,AL的内容为0000000H,且有进位,标志寄存器中各标志位的值为:OF=0,SF=0,ZF=1,AF=1,PF=1,CF=1 9. 已知程序段如下: MOV AX,1234H MOV CL,4 ROL AX,CL DEC AX MOV CX,4 MUL CX

试问:1、每条指令执行完后,AX的内容是什么? 2、每条指令执行完后,CF、SF和ZF的值是什么? 3、程序执行完后,AX和DX的内容是什么? 答:(1)(2)

MOV AX,1234H ; (AX)=1234H,各标志位不变 MOV CL,4 ; (AX)=1234H,各标志位不变

ROL AX,CL ; (AX)=2341H,CF=1,其它标志位不变 DEC AX ; (AX)=2340H,CF不变,SF=0,ZF=0 MOV CX,4 ; (AX)=2340H,各标志位不变 MUL CX ; (AX)=8D00H,CF=0,ZF=0,SF=0 (3)程序执行完后,(AX)=8D00H,(DX)=0000H

10. 编程序段,将AL、BL、CL、DL相加,结果存在DX中。 答:MOV AH,0

ADD AL,BL ADC AH,0 ADD AL,CL ADC AH,0 ADD AL,DL ADC AH,0 MOV DX,AX

11. 编程序段,从AX中减去DI,SI和BP中的数据,结果送BX。 答:SUB AX,DI

SUB AX,SI SUB AX,BP MOV BX,AX

12. 假设(BX)=0E3H,变量VALUE中存放的内容为79H,确定下列各指令单独执行后的结果。

(1) OR BX,VALUE (2) AND BX,VALUE (3) XOR BX,OFFH (4) AND BX,01H (5) TEST BX,05H

(6) XOR BX,VALUE 答: (1) (BX)=0FBH

(2) (BX)=61H (3) (BX)=1CH (4) (BX)=01H (5) (BX)=0E3H (6) (BX)=9AH

13. 已知数据段500H~600H处存放了一个字符串,说明下列程序段执行后的结果。

MOV SI,600H MOV DI,601H MOV AX,DS

MOV ES,AX MOV CX,256 STD

REP MOVSB

答:将数据段501H~600H中存储的字符串移到数据段502~601H中 14. 说明下列程序段的功能。

CLD

MOV AX,0FEFH MOV CX,5

MOV BX,3000H MOV ES,BX MOV DI,2000H REP STOSW

答:将附加段的32000H开始的连续5个字初始化为0FEFH 15. 判断下列程序段跳转的条件。 (1) XOR AX,1E1EH JE EQUAL

(2) TEST AL,10000001B JNZ THERE (3) CMP CX,64H JB THERE

答:(1) AX中的值为1E1EH时会跳转(2) AL的最低和最高位至少有一位为1时发生跳转

(3) CX中的值小于64H时发生跳转 16. 选取正确指令,完成以下任务。

(1) 右移DI三位,并将0移入最左一位。(2) AL内容左移一位,0移入最后一位。(3) DX寄存器右移一位,并且使结果的符号位与原符号位相同。 答:(1) MOV CL,3 SHR DI,CL

(2) SHL AL,1(3) SAR DX,1

17. 假设AX和SI存放的是有符号数,DX和DI存放的是无符号数,请用比较

指令和条件转移指令实现以下判断。

(1) 若DX>DI,转到ABOVE执行(2) 若AX>SI,转到GREATER执行。 (3) 若CX=0,转到ZERO执行(4) 若AX-SI产生溢出,转到OVERFLOW执行。

(5) 若SI≤AX,转到LESS_EQ执行。(6) 若DI≤DX,转到BELOW_EQ执行。

答:(1) CMP DX,DI JA ABOVE

(2) CMP AX,SI JG GREATER (3) CMP CX,0 JE ZERO (4)CMP AX,SI

JO OVERFLOW (5) CMP AX,SI

JGE LESS_EQ (6) CMP DX,DI

JAE BELOW_EQ

18. 有一个首地址为ARRAY的20个字数组,说明下列程序段的功能。 MOV CX,20 MOV AX,0 MOV SI,AX

SUM_LOOP: ADD AX,ARRAY[SI] ADD SI,2

LOOP SUM_LOOP MOV TOTAL,AX

答:将首地址为ARRAY的20个字数组元素求和,将结果存放到TOTAL单元 22. 已知内存中起始地址为BLOCK的数据块(字节数为COUNT)的字节数据

有正有负。试编写一个程序,将其中的正、负分开,分别送至同一段中的两个缓冲区,设正、负缓冲区的首地址分别为PLUS和MINUS。 答: DATA SEGMENT

BLOCK DB 16 DUP(?) PLUS DB 16 DUP(?) MINUS DB 16 DUP(?) DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX

MOV SI,OFFSET BLOCK MOV DI,OFFSET PLUS MOV BX,OFFSET MINUS MOV CX,COUNT NEXT:MOV AL,[SI] TEST AL,80H JNZ MD

MOV [DI],AL INC DI JMP AGAIN MD: MOV [BX],AL INC BX AGAIN: INC SI LOOP NEXT MOV AH,4CH INT 21H CODE ENDS END START

19. 按照下列要求,编写相应的程序段。

(1) 已知字符串STRING包含有32KB内容,将其中的“$”符号替换成空格。

(2) 有一个100个字节元素的数组,其首地址为ARRAY,将每个元素减1

(不考虑溢出)存于原处。

(3) 统计以“$”结尾的字符串STRING的字符个数

(4) 假设从B800H:0开始存放有16个16位无符号数,编程求它们的和,

并把32位的和保存在DX、AX中。

答:(1)

MOV SI,0

MOV CX,8000H

AGAIN:CMP STRING[SI],’$’ JNZ NEXT

MOV STRING[SI],20H NEXT:INC SI LOOP AGAIN

(2)

MOV SI,0 MOV CX,100

AGAIN:DEC ARRAY[SI] INC SI LOOP AGAIN

(3)

XOR SI,SI

COMP:CMP STRING[SI],’$’ JE OVER INC SI JMP COMP OVER:RET (4)

MOV AX,0B800H MOV DS,AX XOR SI,SI XOR DX,DX MOV CX,0FH MOV AX,[SI] AGAIN:INC SI INC SI

ADD AX,[SI] JNC NEXT INC DX

NEXT:LOOP AGAIN

JMP NEXT ;继续输入下一字符 MOV AH,4CH INT 21H CODE ENDS

END START (2) 中断方式

CODE SEGMENT

ASSUME CS:CODE

START:MOV AH,1 ;输入字符 INT 21H

MOV DL,AL

MOV AH,2 ;显示字符 INT 21H

MOV AH,5 ;打印字符 INT 21H

JMP START ;下一字符

EXIT:MOV AX,4C00H

INT 21H

CODE ENDS

END START

第9章 C语言与汇编语言混合编程

1.什么是混合编程,汇编语言与C语言在混合编程时应注意什么问题? 答:将汇编语言代码嵌入到C语言中进行程序设计就是混合编程。 应注意的问题:

(1) 嵌入式汇编程序的指令格式 (2) 嵌入式汇编程序的编译和连接

(3) 汇编指令和C语言间对函数、变量及各中参数的共用问题,即接口问题 (4) C语言调用汇编模块的编程规则及变异连接方法

2.汇编语言与C语言混合编程有哪两种方式,各自的特点是什么? 答:嵌入式汇编方式:特点是在C语言程序中直接嵌入汇编语言指令。

模块调用方式:特点是C语言和汇编语言分别编写独立的模块,分别产生目标代码,然后连接生成一个完整的可执行文件。 3.说明在C语言环境下嵌入汇编语言指令格式。

答:⑴逐条嵌入格式:嵌入的各汇编指令代码前面都要加上“asm”关键字, 每行以分号或换行符结束。⑵成组嵌入格式:嵌入的各汇编指令代码放在同一个asm代码块中,代码块从“{”开始,到“}”结束,由“asm”关键字标识。

4.说明在嵌入式汇编程序中访问C程序变量的一般方法。 答:直接使用该变量名即可。

5.在Visual C环境下利用嵌入式汇编指令,完成对两个C变量的求和,结果由C程序显示。 答: main() {

int sum; int var1=5; int var2=6; __asm{

mov eax,var1 add eax,var2 mov sum,eax }

printf(“%d”,sum); }

6.在Visual C程序中输入两个整数,然后调用汇编子程序对两个数求差,结果在主程序中显示。

答: main() {

int result,var1,var2;

scanf(“%d,%d\\n”,&var1,&var2); __asm{

mov eax,var1 sub eax,var2 mov result,eax }

printf(“%d”,result); }

7.在Visual C程序中编写一个嵌入式汇编排序函数,C语言主程序提供待排序的数据并显示排序后的结果。 答:用起泡方法从大到小排序

main() {

int a[5]={2,-8,9,3,6}; int n = 5; __asm{

lea ebx,a mov ecx,n dec ecx loop1:mov edx,ecx mov esi,0

loop2:mov eax,[ebx+esi] cmp eax,[ebx+esi+2] jge next

xchg eax,[ebx+esi+2] mov [ebx+esi],eax next:add si,2 loop loop2 mov ecx,edx

loop loop1 }

for(int i=0;i++;i<5)

printf(“%d\\n”,a[i]); }

8.用嵌入汇编指令编写一个字符转换函数,实现将C语言主程序中的一个字符串内容的所有小写字母转换位大写字母。转换前后的字符串内容由C语言主程序打印显示。 答:

main() {

char str[5]={ 'h','e','l','e','o'}; int n = 5; int i=0;

__asm lea ebx,str __asm mov esi,0 for(i=0;i

printf(\ __asm{

mov eax,[ebx+esi] cmp eax,61h jb next cmp eax,7ah ja next sub eax,20h

mov [ebx+esi],eax next:inc esi } }

printf(\ for(int i=0;i++;i<5)

printf(\ }

9.在嵌入式汇编指令中调用一个C函数。 答:TURBO C++3.0下的程序如下:

void fun()

{

printf(\ retrun;

}

main() {

void (*p)();

p=fun; asm call p

}

10.进行32位混合编程时,如何编写Visual C主程序和汇编语言过程?

答:(1) Visual C主程序要采用3种调用规范之一进行汇编子程序的调用;汇编程序中可用.model伪指令说明汇编语言的调用规范。(2) 汇编子程序中的过程名及变量名应该用public进行说明。Visual c主程序中应将用到的汇编子程序的过程名和变量名说明为外部符号,并且不能在名字前加下划线。(3) 32位汇编时要用EAX、EBX等32位寄存器(4) Visual C主程序调用汇编子程序时,通过堆栈传递参数,顺序从右到左。汇编子程序的返回值小于4字节时放到EAX寄存器中;返回值在4~8字节之间,放在EDX:EAX寄存器中;返回值大于8字节,返回值得地址指针放在EAX中。

11.说明C程序调用外部汇编模块的具体方法,并总结参数传递和汇编模块返回值的接口约定。分析C程序调用汇编模块前后的堆栈变化情况。

答:(1) C程序调用外部汇编模块的具体方法:调用程序和被调用的汇编过程必须使用相同的存储模型;汇编子程序的过程名和变量名都应说明为public且过程名和变量名前加下划线;在C中应将在本程序中用到的汇编子程序的过程名和变量名说明为外部过程和变量,并且不能在名字前加下划线。(2) 参数传递和汇编模块返回值的接口约定:通过堆栈传递参数(从右到左);传值时直接写出实际参数,传址时在extern说明语句中将参数类型说明成指针类型,并在调用时给出参数地址。返回值通过寄存器传递,16位返回值用AX,32位返回值用DX:AX,返回值大于32位则放到静态变量存储区(near调用时该数据的首地址存放在AX中,far调用时该数据的首地址存放在DX:AX中)。(3) 调用时将参数从右向左依次压入堆栈,再将返回地址压入堆栈;返回后将内容依次弹出即可。

12.编写两个数求和的汇编模块,两个操作数通过堆栈传递,在C程序中输入两个整数,调用汇编模块求和,结果在主程序中打印显示。画图说明调用汇编模块前后堆栈变化情况。 答:C语言源程序:

extern \ main() {

int x,y,z;

scanf(\ asm mov ax,x asm mov bx,y asm push bx asm push ax z=adds();

printf(\ } 汇编语言源程序:

.MODEL SMALL PUBLIC _ADDS

.CODE

_ADDS PROC PUSH BP MOV BP,SP MOV AX,[BP+4] MOV BX,[BP+6] ADD AX,BX POP BP RET 4 _ADDS ENDP END

调用前堆栈情况如题图9.1。调用后堆栈情况如题图9.2。

SS→SS→┇SP→┇BP偏移地址XYSP→调用后堆栈

题图9.1 题图9.2

13.若一个C主程序MAIN要调用汇编子程序SUB1,试问:(1) MAIN模块中的什么指令告诉汇编程序SUB1是在外部定义的?(2) SUB1怎么知道MAIN模块要调用它?

答:(1) EXTERN指令(2) SUB1子程序要声明为PUBLIC类型且加下划线,表明可被外部程序调用

14.编制计算一个数组中能被3整除的数据之和的子程序,并利用此子程序编制求A、B、C 三个数组中能被3整除的数据之和的主程序,要求主程序和子程序分别进行编制。 答:C语言主程序:

extern \ main() {

int s=0;

int a[5]={3,5,7,9,14}; int b[5]={4,6,15,24,8}; int c[5]={36,72,1,83,6};

s=sum(a,5)+sum(b,5)+sum(c,5); printf(\ } 汇编语言子程序:

.MODEL SMALL PUBLIC _SUM .CODE _SUM PROC

调用前堆栈

PUSH BP MOV BP,SP MOV BX,[BP+4] MOV CX,[BP+6] MOV SI,0 MOV DI,0

NEXT:MOV AX,[BX+SI] MOV DL,3 DIV DL

TEST AH,0FFH JNE REPEAT ADD DI,[BX+SI] REPEAT:ADD SI,2 LOOP NEXT MOV AX,DI POP BP RET

_ADDS ENDP END

本文来源:https://www.bwwdw.com/article/dbg7.html

Top