汇编习题答案

更新时间:2023-10-21 10:27:01 阅读量: 综合文库 文档下载

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

;

; 教材课课后习题3-27

;编制程序完成两个已知双精度数(4字节)A和B相加并将结果存入双精度变量单元SUM中(不考虑溢出)。 ;

.model small .stack .data A DD 12345678h B DD 11111111h SUM DD ? .code .startup mov ax ,word ptr A[0] ;注意:变量都为双字类型,所以与字类型寄存器相加要临时改变类型 mov dx ,word ptr A+2 add ax ,word ptr B[0] adc dx ,word ptr B[2] mov word ptr SUM[0],ax mov word ptr SUM[2],dx .exit 0 End ;

; 教材课课后习题3-28 ;编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H等10个字节数据之和,并将结果存入字节变量SUM中(不考虑溢出)。 ;

.model small .stack .data

X db 1h,1h,01h,1h,1h,01h,1h,01h,1h,1h

SUM dw ? ;注意:题目要求是字节类型,不考虑溢出。但这里使用的是字类型 .code .startup

mov cx,10 xor ax,ax ;mov ax,0 mov bx,offset x again: add al,[bx] adc ah,0 ;将数组中的数据累加到AX,注意AH的处理。 inc bx loop again

mov SUM,ax .exit 0 End ;

; 教材课课后习题4-10

;设变量bufX为有符号16位数,请将它的符号状态保存在signX,即:如果X大于等于0,保存0;如果X小于0,保存-1(ffh)。编写该程序。 ;

.model small .stack .data

bufx dw 8111h ;样例数据,可以随便改。但最好分别取正、负数进行测试 signx db ? .code .startup mov ax,bufx test ax,8000h ;测试符号位 jnz next1 mov signx, 0 jmp out1 next1: mov signx,0ffh out1: mov bl,signx .exit 0 End ;

; 教材课课后习题4-15

;不用串操作指令求主存0040h : 0开始的一个64KB物理段中共有多少个空格? ;

.model small .stack

.data .code .startup mov ax,0040h mov ds,ax ;将段地址0040送到DS mov si,0 xor bx,bx ;用BX计数空格的次数 mov cx,0 ;CX初值为0,则最多可进行64K次循环 again: cmp byte ptr[si],' ' jnz do add bx,1 do: inc si dec cx jnz again ;这两句可改为loop again ;程序运行结束后,次数在BX中,用R命令查看BX的值即可。 .exit 0 End ;

; 教材课课后习题4-16

;编程实现把键入的一个字符,用二进制形式(0 / 1)显示出它的ASCII代码值。 ;

.model small .stack .data .code .startup mov ah,01h int 21h ;输入一个字符 mov bl,al ;因为系统调用要用到al寄存器,所以移位时不用al mov cx,8 again: shl bl,1 ;向左移位,将最高位移入CF标志位 jc one mov dl,'0' jmp two one:mov dl,'1'

two:mov ah,02h ;思考一下,如果用单分支如何实现? int 21h loop again .exit 0 end ;

; 教材课课后习题4-18

;编写程序,将一个包含有20个有符号数据的数组arrayM分成两个数组:

;正数数组arrayP和负数数组arrayN,并分别把这两个数组中的数据个数显示出来。 ;

.model small .stack .data arraym db 1,-2,3,-4,5,-6,-7,-8,9,10,11,-12,-13,-14,-15,16,17,-18,19,-20 arrayp db 20 dup(?) arrayn db 20 dup(?) p db 0 ;用于计数正数个数 n db 0 ;用于计数负数个数 .code .startup mov si,offset arraym mov di,offset arrayp mov bx,offset arrayn mov cx,20 cld mov ax,ds mov es,ax go: lodsb test al,80h jnz arn stosb

inc p jmp again arn: xchg bx,di ;用DI指向负数数据,因为串指令STOSB规定用其作为指针 stosb inc n xchg bx,di again: dec cx jnz go ;可用LOOP指令代替

;以下代码输入正数的个数 mov dl,'+' ;提示为正数个数 mov ah,2 int 21h mov al,p mov ah,0 mov bl,10 div bl ;余数在ah,商在al add ax,3030h mov dh,ah mov dl,al mov ah,2 int 21h mov dl,dh mov ah,2 int 21h

;以下代码输入负数的个数 mov dl,'-' ;提示为正数个数 mov ah,2 int 21h mov al,n mov ah,0 mov bl,10 div bl ;余数在ah,商在al add ax,3030h mov dh,ah mov dl,al mov ah,2 int 21h

mov dl,dh mov ah,2 int 21h

;思考:显示正、负数个数,用子程序如何实现?? .exit 0 end ;

; 4-19参考代码。

;编写计算100个正整数之和的程序。如果和不超过16位字的范围(65535),

;则保存其和到wordsum,如超过则显示‘overflow’。 ;

.model small .stack .data

count=10 ;本题以十个数为例 array dw 1234h,0fff0h,1h,2h,3h,3h,4h,5h,6h,7fh wordsum dw ?

string1 db 'overflow','$' .code .startup mov si,offset array mov cx,count cld xor bx,bx again: lodsw ;也可以不用串操作,采用直接寻址,请思考如何实现 add bx,ax jc over ;如果发生溢出则显示错误信息,注意:jc用于无符数,jo用于带符号数 loop again jmp next over: mov ah,09h mov dx,offset string1

int 21h jmp last next: mov wordsum,bx last: .exit 0 End ;

; 教材课课后习题4-27

;请按如下子程序说明编写过程:

;子程序功能:把用ASCII码表示的两位十进制数转换为对应二进制数

;入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码

;出口参数:AL=对应的二进制数 ;

.model small .stack .data

decimal db 31h,31h binary db ? .code .startup mov dh,decimal+1 ;设置入口参数 mov dl,decimal call chang mov binary,al ;从出口参数取结果 .exit 0

;功能:把用ASCII表示的2位十进制数转换为对应的二进制数

;入口参数:DH,DL为两上ASCII码表示的十进制数

;出口参数:AL为对就应的二进制数 chang proc near sub dh,30h ;字符型的十进制数转换成数值型数据 sub dl,30h mov al,dh mov bl,10 ;十位要乘于10,再与个位相加 mul bl add al,dl

ret chang endp end ;

; 教材课课后习题4-28

;写一个子程序,根据入口参数AL=0/1/2,分别实现对大写字母转换成小写、小写转换成大写或大小写字母互换。 ;欲转换的字符串在string中,用0表示结束。 ;

.model small .stack .data msgSource db 'soure string is:',0dh,0ah,'$' msgDestination db 'Destination string is:',0dh,0ah,'$' msgPrompt db 0dh,0ah,'please choose: 0-toLower 1-toUpper 2-exchange',0dh,0ah,'$' ;相当于一个菜单 source db 'MASM is great!',0,0dh,0ah,'$' destination db 20 dup(?),0dh,0ah,'$' string1 db 'please input a number(0 ,1,2):','$' .code .startup

;显示提示信息 mov ah,09h mov dx,offset msgSource int 21h ;显示原字符串 mov ah,09h mov dx,offset source int 21h ;显示输入提示信息 mov ah,09h mov dx,offset msgPrompt int 21h

again: mov ah,01h ;输入选择 int 21h

cmp al,30h ;判断是不是0-2中的数字,如果不是,重新输入 jz goon cmp al,31h jz goon cmp al,32h jnz again

goon: and al,0fh ;设定入口参数,注意:约定存储单元不用设定 call change ;调用子程序 ;显示提示信息 mov ah,09h mov dx,offset msgDestination int 21h ;显示目的字符串 mov ah,09h mov dx,offset destination int 21h .exit 0

;功能: ;入口参数:al=0-转换为小写 1-转换为大写 2-大小写互换

; source(存储单元) ;入口参数:destination(存储单元)

change proc ;子程序开始 mov si,offset source ;si指向原串 mov di,offset destination ;di指向目的串 cmp al,2h ;根据入口参数AL,决定做何转换 jz exchange cmp al,1h jz toUpper toLower: ;大写字母变成小写字母(输入0) mov al,[si] or al,al jz done cmp al,'A' jb next cmp al,'Z' ja next add al,20h next: mov [di],al inc si inc di jmp toLower

toUpper: ;小写字母变成大写字母(输入1) mov al,[si] or al,al jz done cmp al,'a' jb next1 cmp al,'z' ja next1 sub al,20h next1: mov [di],al inc si inc di jmp toUpper

exchange: ;大写字母变小写,小写子母变大写(输入2) mov al,[si] or al,al jz done cmp al,'A' jb next2 cmp al,'Z' ja to add al,20h jmp next2 to:

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

Top