>
第3章
3.1:
汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数,可以直接、有效地控制计算机硬件,因而容易创建代码序列短小、运行快速的可执行程序
3.2 解:
(1)完整的汇编语言源程序由段组成
(2)一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列
(3)需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点
(4)所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内
(5)通常,程序还需要一个堆栈段 3.3 解: 存储模式 TINY SMALL COMPACT MEDIUM LARGE HUGE FLAT 特 点 COM类型程序,只有一个小于64KB的逻辑段(MASM 6.x支持) 小应用程序,只有一个代码段和一个数据段(含堆栈段),每段不大于64KB 代码少、数据多的程序,只有一个代码段,但有多个数据段 代码多、数据少的程序,可有多个代码段,只有一个数据段 大应用程序,可有多个代码段和多个数据段(静态数据小于64KB) 更大应用程序,可有多个代码段和多个数据段(对静态数据没有限制) 32位应用程序,运行在32位80x86CPU和Windows 9x或NT环境 3.4解:
开始位置:用标号指明
返回DOS:利用DOS功能调用的4CH子功能来实现 汇编停止:执行到一条END伪指令时,停止汇编
3.5解:
段定位、段组合和段类型。
3.6给出采用一个源程序格式书写的例题3.1源程序
例题3.1:创建一个在屏幕上显示一段信息的程序?? 解: stack segment stack db 1024(0) stack ends
41h data segment
string db 'Hello,Assembly!',0dH,0aH,‘$’ data ends
code segment 'code'
assume cs:code,ds:data,ss:stack start: mov dx,offset string mov ah,9 int 21h code ends
end start
3.7DOS支持哪两种可执行程序结构,编写这两种程序时需要注意什么? 解:
(1). EXE程序
程序可以有多个代码段和多个数据段,程序长度可以超过64KB 通常生成EXE结构的可执行程序 (2). COM程序
只有一个逻辑段,程序长度不超过64KB
需要满足一定条件才能生成COM结构的可执行程序(MASM 6.x需要采用TINY模式)
3.8举例说明等价“EUQ”伪指令和等号“=”伪指令的用途 解:
符号定义伪指令有“等价EQU”和“等号=”: 符号名 EQU 数值表达式 符号名 EQU <字符串> 符号名 = 数值表达式
EQU用于数值等价时不能重复定义符号名,但“=”允许有重复赋值。例如: X= 7 ;等效于:X equ 7 X= X+5 ;“X EQU X+5”是错误的
3.9 解:
(1) al=67h
(2) ax=133h,dx=4h (3) ax=0230h (4) al=41h (4) ax=7654h
3.10解: (1) 441145h 46h -1 ? 4 4 4 -1 ? 4 4 4 -1 ? 4 4 230 0h h h (2) 10h 00h 0fbh 0ffh ? ? ? ? ? ? 3.11 解:.data
my1b db 'Personal Computer' my2b db 20 my3b db 14h
my4b db 00010100b
4 my5w dw 20 dup(?) my6c = 100
my7c = <'Personal Computer'>
3.12 希望控制变量或程序代码在段中的偏移地址,应该使用哪个伪指令? 解:
利用定位伪指令控制,如org,even,align
3.13名字和符号有什么属性? 解:
包括逻辑地址和类型两种属性。
3.14解: ;数据段
org 100h
varw dw 1234h , 5678h varb db 3 , 4 vard dd 12345678h buff dd 10 dup(?) mess db 'Hello' ;代码段
mov ax , offset varb + offset mess
mov ax , type buff + type mess + type vard mov ax , sizeof varw+ sizeof buff+ sizeof mess mov ax , lengthof varw+ lengthof vard
3.15解:
(1) 1000超过一个字节所能表达的最大整数 (2)SI应为偶数
(3)两个内存单元不能直接运算 (4)应改为[al+1]
(5)条件转移指令后面应接标号,而不是变量
3.16编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来
解: mov ah,1 ;只允许输入小写字母 int 21h sub al,20h ;转换为大写字母 mov dl,al mov ah,2 int 21h ;显示
3.17 解: mov bx,offset LEDtable mov al,lednum xlat 3.18 解:
done: 3.19 解: bufX signX
next: done: 3.20 解:
next1:
next2:
3.21 解:
restart:
again:
next:
mov ax, bufX cmp ax, bufY jae done mov ax, bufY mov bufZ, ax
.model small .stack .data dw -7 db ? .code .startup cmp bufX,0 jl next mov signX,0 jmp done mov signX,-1 .exit 0 end
mov dl,’2’ mov ax,bufX cmp ax,bufY je next1 dec dl
cmp ax,bufZ je next2 dec dl mov ah,2 int 21h
;代码段
mov al,number mov bx,0 cmp al,0 jz done shr al,1 jc next inc bx jmp again push ax push bx shl bx,1
jmp addrs[bx]
;jnz next
←记录为1的位数 =0结束 最低位右移进入CF 为1,转移 不为1,继续
位数乘以2(偏移地址要用2个字节单元)间接转移:IP←[table+BX]
;test bufX,80h ;BX;AL;;;; ; ;以下是各个处理程序段 fun0: mov dl,'0' jmp disp fun1: mov dl,'1' jmp disp fun2: mov dl,'2' jmp disp fun3: mov dl,'3' jmp disp fun4: mov dl,'4' jmp disp fun5: mov dl,'5' jmp disp fun6: mov dl,'6' jmp disp fun7: mov dl,'7' jmp disp ; disp: mov ah,2 ;显示一个字符 int 21h pop bx pop ax jmp restart done: ? 3.22
;wjxt322.asm .model small .stack .data b_data db 12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h ;原始数据 num equ 10 ;数据个数 sum db ? ;预留结果单元 .code .startup xor si, si ;位移量清零 xor al, al ;取第一个数 mov cx, num ;累加次数 again: add al, b_data[si] ;累加 inc si ;指向下一个数 loop again ;如未完,继续累加 mov sum, al ;完了,存结果 .exit 0 end
3.23 求主存0040h:0开始的一个64KB物理段中共有多少个空格?
; wjxt323.asm .model small .code start: mov ax,0040h ;送段地址