HUGE FLAT 更大应用程序,可有多个代码段和多个数据段(对静态数据没有限制) 32位应用程序,运行在32位80x86CPU和Windows 9x或NT环境 3.4 解:
开始位置:用标号指明
返回DOS:利用DOS功能调用的4CH子功能来实现 汇编停止:执行到一条END伪指令时,停止汇编
3.5 解:
段定位、段组合和段类型。
3.6 解:
stack segment stack db 1024(0) stack ends
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.7 解:
(1). EXE程序
程序可以有多个代码段和多个数据段,程序长度可以超过64KB 通常生成EXE结构的可执行程序 (2). COM程序
只有一个逻辑段,程序长度不超过64KB
需要满足一定条件才能生成COM结构的可执行程序(MASM 6.x需要采用TINY模式)
3.8 解:
符号定义伪指令有“等价EQU”和“等号=”: 符号名 EQU 数值表达式 符号名 EQU <字符串> 符号名 = 数值表达式
EQU用于数值等价时不能重复定义符号名,但“=”允许有重复赋值。例如: X= 7 ;等效于:X equ 7 X= X+5 ;“X EQU X+5”是错误的
5
41h
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 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 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
? 4 4 4 ? 6
mov ax , lengthof varw+ lengthof vard
3.15 解:
(1) 1000超过一个字节所能表达的最大整数 (2)SI应为偶数
(3)两个内存单元不能直接运算 (4)应改为[al+1]
(5)条件转移指令后面应接标号,而不是变量
3.16 解:
3.17 解:
3.18 解: done:
3.19 解: bufX signX next: done:
mov ah,1 ;只允许输入小写字母int 21h sub al,20h ;转换为大写字母 mov dl,al mov ah,2 int 21h ;显示 mov bx,offset LEDtable mov al,lednum xlat 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 ;test bufX,80h jl next ;jnz next mov signX,0 jmp done mov signX,-1 .exit 0 end
7
3.20 解:
next1:
next2:
3.21 解:
restart:
again:
next:
fun0:
fun1:
fun2:
fun3:
fun4:
fun5:
fun6:
fun7:
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 ;BX←记录为1的位数 cmp al,0 ;AL=0结束 jz done shr al,1 ;最低位右移进入CF jc next ;为1,转移 inc bx ;不为1,继续 jmp again push ax push bx shl bx,1 ;位数乘以2(偏移地址要用2个字节单元)jmp addrs[bx] ;间接转移:IP←[table+BX] ;以下是各个处理程序段 mov dl,'0' jmp disp mov dl,'1' jmp disp mov dl,'2' jmp disp mov dl,'3' jmp disp mov dl,'4' jmp disp mov dl,'5' jmp disp mov dl,'6' jmp disp mov dl,'7' jmp disp
8