汇编语言程序设计
实验三
(1)将下面的数据段输入,取名为1.asm, 保存在MASM文件夹下,生成.lst文件,不必连接运行,查看1.lst文件,试回答:DA1,DA2 的偏移量分别为多少? COUNT的值为多少?
data segment org 20h
num1=8
num2=num1+10h da1 db 'IBM PC' da2 db 0ah,0dh count equ $-da1 data ends end
汇编语言程序调试运行
学号: 姓名:
DA1 偏移量为20,DA2偏移量为26,count值为8
(2)输入下列指令,改正可能的错误(先不要运行程序):
data segment
var1 db 0, 25, 0DH,30 var2 db 12h,0a4h,6bh var3 db 'ABCDEF'
var4 dw 1234h, 5678h var5 dw 10h dup(?) data ends code segment
assume cs:code, ds:data begin mov ax, data
mov ds, ax lea si, var5
mov bx, offset var2 mov [si], 0abh mov ax, var1+2 mov [bx], [si] mov var5+4, var4 mov ah, 4ch int 21h code ends
end start
正确代码: data segment
var1 db 0,25,0DH,255 var2 db 12h,04h,6bh var3 db 'ABCDEF'
var4 dw 1234h, 5678h var5 dw 10h dup(?) data ends code segment
assume cs:code, ds:data start:mov ax, data mov ds, ax lea si, var5
mov bx, offset var2 mov ax,0abh mov [si],ax
mov al,var1+2 mov ax,[si] mov [bx],ax
mov ax,var4 mov var5+4,ax mov ah,4ch int 21h code ends
end start
(3) 写一个完整的程序放在代码段C_SEG 中,要求把数据段D_SEG中的AGUEND和附加段E_SEG中的ADDEND相加,并把结果存放在D_SEG中的SUM中。其中AUGEND,ADDEND,SUM均为dw类型,AUGEND赋值为9251,ADDEND赋值为-5962。实验报告中要求写出源程序,简单叙述上机步骤,调试方法。 a.实验步骤:
1. 将 AGUEND、AGUEND+2分别存入AX,DX中。
2.与ADDEND、ADDEND+2相加后,将相加后的结果存入 SUM、SUM+2中。 3. 以十六进制的形式显示结果。
b.源程序:
datas segment augend dd 9251 sum dd ? datas ends e_seg segment addend dd -5962 e_seg ends codes segment
assume cs:codes,ds:datas,es:e_seg start:
mov ax,datas mov ds,ax mov ax,e_seg mov es,ax
mov ax,word ptr [augend] add ax,word ptr es:[addend] mov dx,word ptr [augend+2] adc dx,word ptr es:[addend+2] mov word ptr [sum],ax mov word ptr [sum+2],dx mov bx,word ptr [sum+2] mov ch,4 mov dh,1 AA:
mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h cmp al,3ah
jl print add al,07h print:
mov dl,al mov ah,2 int 21h dec ch jnz aa
mov bx,word ptr [sum] mov ch,4 dec dh jz aa
mov ah,4ch int 21h codes ends end start c.显示结果:
(4) 数组中是一组无符号数,将最小数放在M单元中,经过汇编后,形成.EXE文件,先用G=0命令执行程序,用-D命令查看M单元的内容,会发现结果不正确。用单步执行命令T查找程序中的逻辑错误。
DSEG SEGMENT
MSG DB 13, 15, 7, 25, 24 M DB ? DSEG ENDS CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG START: MOV AX, DSEG MOV DS, AX
MOV CX, 4 MOV AL, MSG
L1:
NEXT:
MOV SI, OFFSET MSG+1 CMP AL, [SI] JB NEXT MOV AL, [SI] LOOP L1 MOV M, AL MOV AX, 4C00H INT 21H
CSEG ENDS END START
1. 程序说明:此程序的目的是要在13,15,7,25,24中找到最小数,并放在M单元。 2. 调试说明:
运行无问题
3. 错误问题:结果中M单元的内容是错的,此时M为13,但真实值应为6.
4.解决方法:
该程序的循环是一个死循环,无法将每个数都进行比较,因此,需要每次循环时地址+1才能将每个数进行比较,所以需要在循环上加“INC SI” 5.修改后程序
DSEG SEGMENT
MSG DB 13, 15, 7, 25, 24 M DB ? DSEG ENDS CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG START: MOV AX, DSEG