第四章汇编语言程序设计。
4-2 下列程序执行后,寄存器ax,bx,cx的内容分别是多少?
d segment at 0202h;定位数据段地址。
org 0202h ;定位偏移地址。
da_word dw 20h
mov ax,da_wordax)=0020h
mov bx,offset da_word ;(bx)=0202h
mov cl,byte ptr da_word ;(cl)=20h(将变量da_word的属性改变为字节型)
mov ch,type da_wordch)=2(变量类型数值)
cx)=0220h
4-4 试编制一程序,把char1中各小写字母分别转换为对应的大写字母,并存放在char2开始的单元中(题目要求:不改变char1的内容)
方法1,小写字母转换一个输出显示一个,前3种方法均使用了al寄存器。
d segment
char1 db "abcdefghijklmnopqrstuvwxyz"
n equ $-char1;变量必须先定义后使用,而不能相反。
char2 db n dup(0) ;不能把此句与上一句对调,char2 db $-char1有。
的同学这样写,错在哪
d ends
s segment stack
db 200 dup(0)
s ends
c segment
assume cs:c,ds:d,ss:s ;assume是伪指令,后面不能写冒号
start: mov ax,d
mov ds,ax
mov es,ax ;只要用到串操作指令且di
lea si,char1 ;mov si,offset char1
lea di,char2 ; mov di,offset char2
mov cx,n ;$char1,不可以。
again:mov al,[si]
sub al,20hand al,5fh 有的同学是这样实现的
mov [di],al
mov dl,al
mov ah,2
int 21h ;从屏幕显示
inc si
inc di
loop again
mov ah,4ch
int 21h ; 不是必须的。
c ends
end start
方法2:使用通用数据传送指令mov
d segment
char1 db ‘abcdefghijklmnopqrstuvwxyz’
n equ $-char1;变量必须先定义后使用,而不能相反。
char2 db n dup(0);不能把此句与上一句对调 d ends
stack segment stack
db 200 dup(0)
stack ends ;p126(**段和堆栈段是不可少的)
c segment
assume cs:c ,ds:d ,ss:s
start: mov ax,d
mov ds,ax
mov es,ax ;只要用到串操作指令且di
mov si,0 ;lea si,char1
mov di,0 ;lea di,char2
mov cx,n
again: mov al,char1[si] ;mov al,[si]
sub al,20h mov char2[di],al ; mov [di],al inc si
inc di
loop again
mov ah,4ch
int 21h ;不是必须的。
c ends
end start
第3种方法:使用串的读写指令lodsb stosb
d segment
char1 db ‘abcdef’
n equ $-char1
char2 db $-char1 dup(0) d ends
stack segment stack
db 200 dup(0)
stack ends ;p126(**段和堆栈段是不可少的)
c segment
assume cs:c,ds:d,ss:s
start: mov ax,d
mov ds,ax
mov es,ax
mov si,0 ;lea si,char1
mov di,0 ;lea di,char2
mov cx,n
cld ;不写(隐含)也是0(递增)但不能std
again: lodsb执行一次,隐含修改si
sub al,32 stosb ;mov [di],al;执行一次, 隐含修改di inc di loop again ;loop指令只修改cx,不管si,di
mov ah,4ch
int 21h ;不是必须的。
c ends
end start
第四种方法2006级,没有显示使用movsb指令。
d segment
char1 db "abcdefghijklmnopqrstuvwxyz"
n equ $-char1
char2 db n dup(0)
d ends
s segment stack
db 200 dup(0)
s ends
c segment
assume cs:c,ds:d,ss:s
start:
mov ax,d
mov ds,ax
mov es,ax
lea si,char1
lea di,char2
mov cx,n
again:movsbsub [si],20h
dec dimovsb
sub byte ptr[di],20h ;loop adain 错在**?结果如何?
inc di
loop again
mov ah,4ch
int 21h
c ends
end start
方法5: 只用一个地址指针si
d segment
char1 db "abcdefghijklmnopqrstuvwxyz"
n equ $-char1
char2 db n dup(0)
微机原理作业与答案
8086第三章作业。3 11在实模式下,若段寄存器中装入如下数值,试写出每个段的起始地址和结束地址。1 1000h 10000h 1ffffh 2 1234h 12340h 2233fh 3 e000h e0000h effffh 4 ab00h ab000h bafffh 3 12对于下列cs i...
微机原理作业答案
程序题作业答案 一 写指令 1 将di寄存器的内容减1dec di或 sub di 1 2 用一条指令使程序从中断服务程序返回 iret 3 从80h端口读入数据送入alin al,80h 4 将3000h及3001h两单元内容与ax寄存器内容相减,并将其差送回原单元。sub 3000h ax 5 ...
微机原理作业答案
第一次作业。2.完成下列补码运算,并根据结果设置标志sf zf cf和of,指出运算结果是否溢出。1 00101101b 10011100b 45 补。100 补。55 补。sf 1 zf 0 cf 0 of 0 无溢出。2 01011101b 10111010b 93 补。70 补。93 补。sf...