汇编习题答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
cmp al,'Z'
ja to
add al,20h
jmp next2
to:
cmp al,'a'
jb next2
cmp al,'z'
ja next2
sub al,20h
next2:
mov [di],al
inc si
inc di
jmp exchange
done:
ret
change endp
end
;教材课课后习题4-29
;
.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:
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表示结束。
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
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用于带符号数
;正数数组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(?)
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指令代替
;以下代码输入正数的个数
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
;
.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,'$' ;相当于一个菜单
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'
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的值即可。
call chang
mov binary,al ;从出口参数取结果
.exit 0
;功能:把用ASCII表示的2位十进制数转换为对应的二进制数
;入口参数:DH,DL为两上ASCII码表示的十进制数
;出口参数:AL为对就应的二进制数
chang proc near
sub dh,30h ;字符型的十进制数转换成数值型数据
;
;教材课课后习题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] ;注意:变量都为双字类型,所以与字类型寄存器相加要临时改变类型
.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 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
;以下代码输入负数的个数
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 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分成两个数组:
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]
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
;入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码
;出口参数:AL=对应的二进制数
;
.model small
.stack
.data
decimal db 31h,31h
binary db ?
.code
.startup
mov dh,decimal+1 ;设置入口参数
mov dl,decimal
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)。编写该程序。
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
.stack
.data
value dw 1f3ah
;编制一个子程序把一个16位二进制数用十六进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并用一个主程序验证它。
;(1)采用AX寄存器传递这个16位二进制数
;(2)采用wordTEMP变量传递这个16位二进制数
;(3)采用堆栈方法传递这个16位二进制数
;
;第一种方法:wenku.baidu.com用寄存器来传递参数
;
.model small
;
.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
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码表示的两位十进制数转换为对应二进制数
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
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中(不考虑溢出)。
.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
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
;思考:显示正、负数个数,用子程序如何实现??
int 21h
;显示目的字符串
mov ah,09h
mov dx,offset destination
int 21h
.exit 0
;功能:
;入口参数:al=0-转换为小写1-转换为大写2-大小写互换
; source(存储单元)
;入口参数:destination(存储单元)
change proc ;子程序开始
ja to
add al,20h
jmp next2
to:
cmp al,'a'
jb next2
cmp al,'z'
ja next2
sub al,20h
next2:
mov [di],al
inc si
inc di
jmp exchange
done:
ret
change endp
end
;教材课课后习题4-29
;
.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:
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表示结束。
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
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用于带符号数
;正数数组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(?)
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指令代替
;以下代码输入正数的个数
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
;
.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,'$' ;相当于一个菜单
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'
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的值即可。
call chang
mov binary,al ;从出口参数取结果
.exit 0
;功能:把用ASCII表示的2位十进制数转换为对应的二进制数
;入口参数:DH,DL为两上ASCII码表示的十进制数
;出口参数:AL为对就应的二进制数
chang proc near
sub dh,30h ;字符型的十进制数转换成数值型数据
;
;教材课课后习题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] ;注意:变量都为双字类型,所以与字类型寄存器相加要临时改变类型
.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 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
;以下代码输入负数的个数
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 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分成两个数组:
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]
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
;入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码
;出口参数:AL=对应的二进制数
;
.model small
.stack
.data
decimal db 31h,31h
binary db ?
.code
.startup
mov dh,decimal+1 ;设置入口参数
mov dl,decimal
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)。编写该程序。
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
.stack
.data
value dw 1f3ah
;编制一个子程序把一个16位二进制数用十六进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并用一个主程序验证它。
;(1)采用AX寄存器传递这个16位二进制数
;(2)采用wordTEMP变量传递这个16位二进制数
;(3)采用堆栈方法传递这个16位二进制数
;
;第一种方法:wenku.baidu.com用寄存器来传递参数
;
.model small
;
.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
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码表示的两位十进制数转换为对应二进制数
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
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中(不考虑溢出)。
.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
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
;思考:显示正、负数个数,用子程序如何实现??
int 21h
;显示目的字符串
mov ah,09h
mov dx,offset destination
int 21h
.exit 0
;功能:
;入口参数:al=0-转换为小写1-转换为大写2-大小写互换
; source(存储单元)
;入口参数:destination(存储单元)
change proc ;子程序开始