王爽汇编语言答案(5-8章)

王爽汇编语言答案(5-8章)

检测点

chapter6

检测点6.1

  1. 下面的程序实现依次用内存 0:0——0:15 单元中的内容改写程序中的数据,完成程序:
assume cs:code
	code segment
		dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
		start:	mov ax,0
				mov ds,ax
				mov bx,0
				mov cx,8
				s:  mov ax,[bx]
				    mov cs:[bx],ax
					add bx,2
					loop s
		
				mov ax,4c00h
				int 21h
	code ends
end start
  1. 下面的程序实现依次用内存0:0——0:15 单元中的内容改写程序中的数据,数据的传送用栈来进行。栈空间设置在程序内。完成程序:
assume cs:code
	code segment
		dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
		dw 0,0,0,0,0,0,0,0,0,0
		start:	mov ax,cs
				mov ss,ax
				mov sp,24h
				
				mov ax,0
				mov ds,ax
				mov bx,0
				mov cx,8
			s:  push [bx]
				pop cs:[bx]
				add bx,2
				loop s
				
				mov ax,4c00h
				int 21h
	code ends
end start

实验

实验 4 [bx]和 loop 的使用

  1. 编程实现向内存0:200——0:23F依次传送数据063(3FH),最多使用9条指令,包括mov ax,4c00hint 21h
assume cs:code
	code segment
		mov ax,0020h
		mov ds,ax
		
		mov bx,0
		mov cx,64
		
		s:mov [bx],bl
			inc bx
			loop s
		
		mov ax,4c00h
		int 21h
	code ends
end
  1. 下面的程序的功能是将 " mov ax,4c00h" 之前的指令复制到内存 0:200 处,补全程序。上机调试,跟踪运行结果。
assume cs:code
code segment
	mov ax,__
	mov ds,ax
	mov ax,0020h
	mov es,ax
	mov bx,0
	mov cx,__
	
	s:mov al,[bx]
		mov es:[bx],al
		inc bx
		loop s
	mov ax,4c00h
	int 21h
code ends
end

完整程序为

assume cs:code
code segment
	mov ax,cs          ;需要把ds数据段指向指令段
	mov ds,ax
	mov ax,0020h
	mov es,ax
	mov bx,0
	mov cx,17h         ;通过debug -u命令可以查看
					   ;mov ax,4c00h 的IP为 0017h
					   ;也就是程序长度17h
	s:mov al,[bx]
		mov es:[bx],al
		inc bx
		loop s
	mov ax,4c00h
	int 21h
code ends
end

实验5

assume cs:code,ss:stack,ds:data
	data segment
		dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
	data ends
	stack segment
		dw 0,0,0,0,0,0,0,0
	stack ends
	code segment
		start:	mov ax,stack
				mov ss,ax
				mov sp,16
				
				mov ax,data
				mov ds,ax
				
				push ds:[0]
				push ds:[2]
				pop ds:[2]
				pop ds:[0]
				
				mov ax,4c00h
				int 21h
	code ends
end start
  1. CPU执行程序,程序返回前,data段中的数据为多少?
    0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
  2. CPU执行程序,程序返回前,cs=076E、ss=076D、ds=076C
  3. 设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1h

assume cs:code,ss:stack,ds:data
	data segment
		dw 0123h,0456h
	data ends
	stack segment
		dw 0,0
	stack ends
	code segment
		start:	mov ax,stack
				mov ss,ax
				mov sp,16
				
				mov ax,data
				mov ds,ax
				
				push ds:[0]
				push ds:[2]
				pop ds:[2]
				pop ds:[0]
				
				mov ax,4c00h
				int 21h
	code ends
end start
  1. CPU执行程序,程序返回前,data段中的数据为多少?
    0123h,0456h,0000h,0000h,0000h,0000h,0000h,0000h
  2. CPU执行程序,程序返回前,cs=076E、ss=076D、ds=076C
  3. 设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1h
  4. 如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为16的倍数且N小于等于该数

assume cs:code,ss:stack,ds:data
	code segment
		start:	mov ax,stack
				mov ss,ax
				mov sp,16
				
				mov ax,data
				mov ds,ax
				
				push ds:[0]
				push ds:[2]
				pop ds:[2]
				pop ds:[0]
				
				mov ax,4c00h
				int 21h
	code ends
	data segment
		dw 0123h,0456h
	data ends
	stack segment
		dw 0,0
	stack ends
end start
  1. CPU执行程序,程序返回前,data段中的数据为多少?
    0123h,0456h,0000h,0000h,0000h,0000h,0000h,0000h
  2. CPU执行程序,程序返回前,cs=076C、ss=0770、ds=076F
  3. 设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4h

如果将上面3个代码中的最后一条伪指令"end start"改为"end"(也就是说,不指明程序的入口),哪个可以正常运行

第三个可以正常运行,前面2个找不到一条代码在哪里,会从IP=0开始运行,
3恰好IP就是0。


程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存
到c段中

assume cs:code
	a segment
		db 1,2,3,4,5,6,7,8 ;实际占用空间16byte
	a ends
	b segment
		db 1,2,3,4,5,6,7,8 ;实际占用空间16byte
	b ends
	c segment
		db 0,0,0,0,0,0,0,0 ;实际占用空间16byte
	c ends
	code segment
		start:	mov ax,a
				mov ds,ax
				
				mov bx,0
				mov cx,8
				mov ax,0
			  s:mov al,ds:[bx]
				add al,ds:[bx+16]
				mov ds:[bx+32],al
				inc bx
				loop s
				
				mov ax,4c00h
				int 21h
	code ends
end start

程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中

assume cs:code
	a segment
		dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
	a ends
	b segment
		dw 0,0,0,0,0,0,0,0
	b ends
	code segment
		start:	mov ax,a
				mov ds,ax
				mov ax,b
				mov ss,ax
				mov sp,16
				
				mov bx,0
				mov cx,8
			  s:push [bx]
				add bx,2
				loop s
				
				mov ax,4c00h
				int 21h
	code ends
end start

实验6 双层循环处理字符串

编程,将data段中每个单词的前4个字母改为大写字母

assume cs:code,ss:stack,ds:data
	data segment
		db '1. display      '
		db '2. brows        '
		db '3. replace      '
		db '4. modify       '
	data ends
	stack segment
		dw 0,0,0,0,0,0,0,0
	stack ends
	code segment
		start:	mov ax,stack
				mov ss,ax
				mov sp,60h
				
				mov ax,data
				mov ds,ax
				
				mov bx,0
				mov cx,4
			s:  push cx
				mov cx,4
				mov si,0
				
			s1: mov al,[bx+si+3]
				and al,11011111B
				mov [bx+si+3],al
				inc si
				loop s1
				
				add bx,16
				pop cx
				loop s
				
				mov ax,4c00h
				int 21h
	code ends
end start

实验7 寻址方式在结构化数据访问中的应用

Poweridea 公司从1975年成立一直到1995年的基本情况如下

年份     收入(千美)元     雇员(人)     人均收入(千美元)
1975   	 16              3            ?      
1976     22              7            ?
1977     382             9            ?       
1978     1356            13           ?    
1979     2390            28           ?
.      
.
.
1980     8000            38           ?
1995     5937000         17800        ?

下面的程序中,已经定义好了这些数据:

data segment
		db'1975','1976','1977','1978','1979','1980','1981','1982','1983'
		db'1984','1985','1986','1987','1988','1989','1990','1991','1992'
		db'1993','1994','1995'
		;以上是表示21年的21个字符串

		dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
		dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
		;以上是表示21年公司总收入的21个dword型数据

		dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
		dw 11542,14430,15257,17800
		;以上是表示21年公司雇员人数的21个word型数据
	data ends
	
	table segment
		db 21dup('year summ ne ?? ')
	table ends

编程,将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照下面的格式保存在table段中。

assume cs:codesg
	data segment
		db'1975','1976','1977','1978','1979','1980','1981','1982','1983'
		db'1984','1985','1986','1987','1988','1989','1990','1991','1992'
		db'1993','1994','1995'
		;以上是表示21年的21个字符串

		dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
		dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
		;以上是表示21年公司总收入的21个dword型数据

		dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
		dw 11542,14430,15257,17800
		;以上是表示21年公司雇员人数的21个word型数据
	data ends
	
	table segment
		db 21 dup('year summ ne ?? ')
	table ends
	
	codesg segment
		 start: mov ax,data
				mov ds,ax
				
				mov si,0
				mov bx,0
				mov cx,21
				mov ax,table
				mov es,ax
				mov di,0
				
			  s:mov ax,[bx]
				mov es:[di],ax
				mov ax,[bx+2]
				mov es:[di+2],ax
				;copy year
				mov ax,[bx+84]
				mov dx,[bx+86]
				mov es:[di+5],ax
				mov es:[di+7],dx
				div word ptr [si+168]
				mov es:[di+13],ax
				;copy sum and per income
				mov ax,[si+168]
				mov es:[di+10],ax
				;copy people
				add di,16
				add bx,4
				add si,2
				loop s
				
				mov ax,4c00h
				int 21h
	codesg ends
end start
posted @ 2021-05-03 18:35  W&B  阅读(261)  评论(0编辑  收藏  举报