⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 汇编代码.txt

📁 一个汇编语言学习的代码,包括学习,研究
💻 TXT
📖 第 1 页 / 共 4 页
字号:
   mov dx,dat2    ;DX放高位字有符号数
   or dx,dx      ;产生标志位
   jns next      ;若为正数转next
   not ax       ;若为负数则低位字求反
   not dx       ;并且高位字求反
   add ax,1      ;低位字加1
   adc dx,0      ;若有进位则高位字再加1
next: mov abs1,ax    ;abs1放低位字绝对值
   mov abs2,dx    ;abs2放高位字绝对值

2、在附加数据段中有一首址为ADDR的没有排序字数组,数据的第一个字为数组长度,第二个字开始存放数组各元素。在KEY单元存放一要删除的字数据。要求编一完整程序,在数组中查找该数,如果找到该数,将其从数组中删除,并修改数组长度。

data segment
addr dw 8,1275h,4652h,0034h,4cbah,1ff0h,563bh,5312h,89abh
key dw 0034h
data ends

code segment
assume cs:code, ds:data, es:data

find proc far
   push ds
   xor ax,ax
   push ax
   mov ax,data
   mov ds,ax
   mov es,ax
   lea di,addr
   push di
   mov ax,key
   mov cx,es:[di]
   add di,2
   cld
   repnz scasw
   jz delete
   pop di
   jmp exit
delete: jcxz next
del: mov bx es:[di]
   mov es:[di-2],bx
   add di,2
   loop del
next: pop di
   dec word ptr es:[di]
exit: ret
find endp

main: call find
code ends
end main

模拟试卷4

1、试编写一程序段,在CHAR为首址的26个字节单元中依次存放字母'A'~'Z'。

char db 26 dup(?)
...
start:lea bx,char
   mov al,'A'
   mov cx,26
lop1: mov [bx],al
   inc al
   inc bx
   loop lop1
... 2、以BUF为首址的存储区,存放有若干个有符号字数据,试编写一程序求出其中负数的平均值(负数之和>-32768),并存放在MEA2单元中。

data segment
buf dw ...
count equ $-buf
mea2 dw ?
data ends

code segment
assume cs:code, ds:data

navl proc near
start: push ds
mov ax,0
push ax
mov ax,data
mov ds,ax
lea si,buf
mov cx,count
shr cx,1
xor dx,dx
mov di,dx
again: mov bx,[si]
cmp bx,0
jge next
add ax,bx
inc di
next: inc si
loop again
mov bx,di
cwd
idiv bx
mov mea2,ax
ret
nval endp

main
......
code ends
end main
 3.5 编写完整程序,把从键盘读入的一个小写字母转换成相应的大写母,并输出。

[解法1]
code segment
assume cs:code
main: mov ah,1
      int 21h          ;输入字符到al
      mov bl,al        ;暂存到bl中
      sub bl,32        ;小写字母转成大写字母

      mov ah,2         ;回车换行
      mov dl,13
      int 21h
      mov dl,10
      int 21h

      mov dl,bl        ;输出大写字母
      int 21h

      mov ah,4ch       ;控制权交还DOS
      int 21h
code ends
end main

[解法2]
data segment
buf1 db "Input a upper char:",'$'
buf2 db 13,10,"not a lower char!",13,10,'$'
data ends
code segment
assume cs:code
main: mov ax,data        ;输出提示buf1
      mov ds,ax
      lea dx,buf1
      mov ah,9
      int 21h

      mov ah,1          ;输入字符并暂存到bl中
      int 21h
      mov bl,al

      cmp bl,'a'
      jb lab1
      cmp bl,'z'
      ja lab1

      sub bl,32         ;小写字母转成大写字母
      mov ah,2          ;回车换行
      mov dl,13
      int 21h
      mov dl,10
      int 21h

      mov dl,bl           ;输出大写字母
      int 21h
      jmp lab

lab1: mov ah,9           ;输出输入字符非小写字母的提示
      lea dx,buf2
      int 21h

lab:   mov ah,4ch        ;控制权交还DOS
          int 21h
code ends
end main
3.6 编写程序,从键盘读入一个符号,如果它的ASCII值是偶数则输出0,是奇数则输出1。[提示:输出除以2的余数]

code segment
assume cs:code
main: mov ah,1
      int 21h          ;输入字符到al
      mov ah,0        ;准备被除数ax
      mov bl,2        ;准备除数bl
      div bl           ;ax除bl,余数在ah中
      add ah,30h    ;转换成字符对应的ascii码
      mov bl,ah      ;暂存到bl中

      mov ah,2        ;回车换行
      mov dl,13
      int 21h
      mov dl,10
      int 21h

      mov dl,bl       ;输出该字符
      int 21h

      mov ah,4ch      ;控制权交还DOS
      int 21h
code ends
end main
3.7 从键盘读入一个小写字母,输出字母表中倒数与该字母序号相同的那个字母。例如输入首字母a,则输出最后一个字母z,输入第4个字母d则输出倒数第4个字母w。

code segment
assume cs:code
main: mov ah,1
      int 21h          ;输入字符到al

      mov bl,'z'     ;求对应的字母并暂存到bl
      sub bl,al
      add bl,'a'

      mov ah,2        ;回车换行
      mov dl,13
      int 21h
      mov dl,10
      int 21h

      mov dl,bl       ;输出该字符
      int 21h

      mov ah,4ch     ;控制权交还DOS
      int 21h
code ends
end main
3.8 编写一个程序段,把AL中的高4位与低4位交换位置。

code segment
assume cs:code
main: mov ah,1
      int 21h         ;输入字符到al

      mov bl,10h
      mul bl          ;al*10h的积在ax中(ah为高位转为低位,al为低位转为高位。)
      add al,ah
      mov bl,al     ;将结果暂存到bl中

      mov ah,2       ;回车换行
      mov dl,13
      int 21h
      mov dl,10
      int 21h

      mov dl,bl     ;输出结果
      int 21h

      mov ah,4ch    ;控制权交还DOS
      int 21h
code ends
end main
4.9 编写完整程序,用十六进制输出一个按键的ASCII值,要求输出形式是:A=41H

[解法1]
code segment
assume cs:code
main: mov ah,1
      int 21h       ;输入字符到al
      mov bl,al     ;暂存到bl中

      mov ah,2      ;回车换行
      mov dl,13
      int 21h
      mov dl,10
      int 21h

      mov dl,bl     ;输出该字符和等号
      int 21h
      mov dl,'='
      int 21h

      mov ah,0      ;将该字符的ascii码送入ax
      mov al,bl
      mov bl,10h    ;准备除数bl=16
      div bl        ;相除后al为商,ah为余数
      mov bx,ax     ;暂存到bx中(bl为商,bh为余数)

      mov si,1      ;si为计数器

      mov dl,bl     ;利用dl计算,再进行输出
      jmp lab3
lab4: mov dl,bh     ;第2次输出余数时送bh

lab3: cmp dl,9      ;除16后,可能小于等于9,或大于9
      ja lab2
      add dl,30h    ;小于9加30h转成数字字符的ascii码
      jmp lab1
lab2: sub dl,10     ;大于9转成字母的ascii码
      add dl,'A'
lab1: mov ah,2      ;输出字符
      int 21h

      inc si        ;计数器加1
      cmp si,2
      jbe lab4      ;比较后若小于等于2跳转,准备余数的计算和输出

      mov dl,'H'    ;输出字符H
      int 21h

      mov ah,4ch    ;控制权交还DOS
      int 21h
code ends
end main

[解法2]
code segment
assume cs:code
main: mov ah,1
      int 21h        ;输入字符到al
      mov bl,al      ;暂存到bl中

      mov ah,2       ;回车换行
      mov dl,13
      int 21h
      mov dl,10
      int 21h

      mov dl,bl      ;输出该字符和等号
      int 21h
      mov dl,'='
      int 21h

      mov si,1       ;si为计数器
lab3: mov al,bl      ;准备被乘数al
      mov bl,10h     ;准备乘数bl=16
      mul bl         ;相乘的积在ax中
      mov bl,al      ;低位al暂存到bl中,后续程序输出高位ah

      mov dl,ah      ;利用dl计算,再进行输出
      cmp dl,9       ;乘以16后,高位可能小于等于9,或大于9
      ja lab2
      add dl,30h     ;小于9加30h转成数字字符的ascii码
      jmp lab1
lab2: sub dl,10      ;大于9转成字母的ascii码
      add dl,'A'
lab1: mov ah,2       ;输出字符
      int 21h

      inc si         ;计数器加1
      cmp si,2
      jbe lab3       ;比较后若小于等于2跳转,准备下一位的输出

      mov dl,'H'     ;输出字符H
      int 21h

      mov ah,4ch     ;控制权交还DOS
      int 21h
code ends
end main

4.10 编写完整程序,用二进制输出一个按键的ASCII值。

code segment
assume cs:code
main: mov ah,1
      int 21h        ;输入字符到al
      mov bl,al      ;暂存到bl中

      mov ah,2       ;回车换行
      mov dl,13
      int 21h
      mov dl,10
      int 21h

      mov cx,8       ;设置循环计数器
lab1: mov al,bl      ;准备被乘数al
      mov bl,2       ;准备乘数bl=2
      mul bl         ;相乘的积在ax中
      mov bl,al      ;低位al暂存到bl中,因为输出功能影响al

      mov dl,ah      ;将高位ah输出
      add dl,30h
      mov ah,2
      int 21h

      loop lab1      ;循环

      mov ah,4ch     ;控制权交还DOS
      int 21h
code ends
end main
4.11 编写完整程序,判断一个按键是不是回车键。

[解法1]
code segment
assume cs:code
main: mov ah,1
      int 21h        ;输入字符到al
      mov bl,al      ;输入字符暂存到bl中

      mov ah,2       ;输出回车换行
      mov dl,13
      int 21h
      mov dl,10
      int 21h

      cmp bl,13      ;比较是否为回车键
      jz lab1
      mov dl,'n'
      jmp lab2
lab1: mov dl,'y'
lab2: mov ah,2
      int 21h

      mov ah,4ch     ;控制权交还DOS
      int 21h
code ends
end main

[解法2]
data segment
buf1 db 'Input:','$'
buf2 db 'Not <Enter>','$'
buf3 db 'It is <Enter>','$'
data ends
code segment
assume cs:code,ds:data
main: mov ax,data    ;利用9号功能输出提示
      mov ds,ax
      lea dx,buf1
      mov ah,9
      int 21h

      mov ah,1       ;利用1号功能输入1个字符,并暂存到bl中
      int 21h
      mov bl,al

      mov ah,2       ;输出回车换行
      mov dl,13
      int 21h
      mov dl,10
      int 21h

      cmp bl,13      ;比较是否为回车键
      jz lab1
      lea dx,buf2
      jmp lab2
lab1: lea dx,buf3
lab2: mov ah,9
      int 21h

      mov ah,4ch     ;控制权交还DOS
      int 21h
code ends
end main

4.12 编写完整程序,输入一个字母,输出该字母在英文字母表中的顺序号,若输入的不是字母则输出“*”。注意输入的字母既可以是大定也可以是小写。

code segment
assume cs:code
main: mov ah,1
      int 21h        ;输入字符到al
      mov bl,al      ;暂存

      mov ah,2       ;回车换行
      mov dl,13
      int 21h
      mov dl,10
      int 21h

      cmp bl,'A'     ;和'A'比较
      jl lab1        ;小于'A'跳转lab1输出'*',大于等于'A'继续比较
      cmp bl,'Z'     ;和'Z'比较
      jle lab2       ;小于等于'Z'表明为大写字母,跳转lab2求序号
      cmp bl,'a'     ;和'a'比较
      jl lab1        ;小于'a'跳转lab1输出'*',大于等于'a'继续比较
      cmp bl,'z'     ;和'z'比较
      jg lab1        ;大于'z'跳转lab1输出'*',小于等于'z'表明为小写字母
      sub bl,'a'-1   ;计算小写字母的顺序号
      jmp lab3
lab2: sub bl,'A'-1   ;计算大写字母的顺序号
lab3: mov ah,0       ;准备被除数ax
      mov al,bl
      mov bl,10      ;准备除数bl
      div bl         ;十位在al中,个位在ah中
      mov bx,ax      ;将结果暂存到bx中
      add bx,3030h

      mov ah,2
      cmp bl,'0'     ;若十位为'0',不输出
      jz lab5
      mov dl,bl      ;输出十位
      int 21h
lab5: mov dl,bh      ;输出个位
      int 21h
      jmp lab4

lab1: mov ah,2       ;输出'*'号
      mov dl,'*'
      mov al,2
      int 21h

lab4: mov ah,4ch     ;控制权交还DOS
      int 21h
code ends
end main

4.13 编写完整程序,把键盘输入的三个按键按ASCII值由小到大的次序输出。
code segment
assume cs:code
main: mov ah,1       ;输入三个字符分别放在cl,bl,al中
      int 21h
      mov cl,al
      int 21h
      mov bl,al
      int 21h

      cmp al,bl      ;若al小于bl交换
      jl lab1
      xchg al,bl
lab1: cmp bl,cl      ;若bl小于cl交换
      jl lab2
      xchg bl,cl
lab2: cmp al,bl      ;若al小于bl交换(注意:请考虑为何不比较al和cl)
      jl lab3
      xchg al,bl

lab3: mov bh,al      ;暂存al到bh中
      mov ah,2       ;回车换行

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -