首页 > 编程知识 正文

汇编语言与接口技术第四版,王爽汇编语言第四版百度云

时间:2023-05-04 20:51:28 阅读:106719 作者:1653

记录学习汇编过程中遇到的有趣的习题

2021/10/05

1.编写程序向内存0:2000:23F依次传送数据0~63。

assume cs : codecodesegmentstart : movax,0H mov ds,ax; ax=ds*16 bx mov bx,200H; 十六进制mov dx,0; 初始化累加器dx=0 mov cx,64; 循环次数64 s: mov ds:[bx],dl inc dl; dx自增inc bx; bx自我增加ds:bx指的是下一个单元loop s mov ax,4c00 h int 21 h代码结束send start

2021/10/07

2.计算ffff:0~ffff:b单元中的数据的和,结果存放在dx中

; 计算ffff:0~ffff:b单元的数据之和的结果,存储在dx中的assume cs : codecodesegmentstart : movax、0ffffh mov ds、ax; 设置段地址mov bx,0; ds:bx指的是ffff:0 mov dx,0; 设定累加器dx=0 mov cx,0bH; s:mov al,[bx] mov ah,0 add dx,ax; dx=(ds ) *16 bx inc bx; ds:bx指向以下设备loop s mov ax,4c 00 hint 21 hcodeendsendstart 2021/11/1

3 .尝试编写计算以下公式的程序:

(提示)可以采用移位命令或乘除命令) )。

z=(3x1y-5 )/2

; z=(3x 1y-5 )/2assume cs:code,ds : datadatasegmentvarxdw 15 var yd w10 varzdw? dataendscodesegmentstart : movax,datamov ds,axmov ax,VARX; ax-xshl ax,1; ax-ax*2add ax,VARX; ax-ax*2 axadd ax,VARY; 3*x ysub ax,5; 3*x y-5shr ax,1; (3x 1y-5 )/2mov VARZ,axmov ax,4c 00 hint 21 hcodeendsendstart http://www.Sina.com /

assume cs : codecodesegmentstart : movax,0A9Hmov bl,0AHdiv blmov bl,ah; bx=0009Hmov ax,0A9Hmov cl,4shr al,cl; al=000AHmov ax,4c00hint 21hcode endsend start

2021/11/2

4.设AL寄存器的初值为0A9H,将AL寄存器中的8位数分成2组,每组4位,编程实现把这两组数从高到低分别放在AL、BL中。

)1)当想执行程序中的jmp指令时,CS:IP指向程序的第一个指令,应该在data段中定义哪些数据

assume cs : codedatasegmentdataendscodesegmentstart : movax、data mov ds、ax mov bx、 0 jmpwordptr [ bx1 ] codeendsendstart指向第一位,将IP的值设为0000H即可,而jmp word ptr是段内转移指令,相当于将IP的值代入后续存储单元的值,因此最初的总线

assume cs : codedatasegmentdb 4d up (0) dataendscodesegmentstart : movax,data mov ds,ax mov bx,0 jmp word p

tr [bx+1]code endsend start

调试

(2)补全程序,使jmp指令执行后,CS:IP指向程序的第一条指令

assume cs:codedata segment dd 12345678Hdata endscode segmentstart:mov ax,data mov ds,ax mov bx,0 mov [bx],bx mov [bx+2],cs jmp dword ptr ds:[0]mov ax,4c00Hint 21Hcode endsend start

执行jmp指令后指向第一条指令,CS段没有改变,只需要改变IP值为0000H。而段间转移相当于把内存地址开始的前两个字节赋值给IP,后面的两字节赋值给CS
调试

2021/11/08

6.编程实现以下功能:双字变量A,B,相加结果放入双字变量C中,相减结果放入双字变量D中。

assume cs:code,ds:datadata segment A dd 12345678H B dd 98765432H C dd ? D dd ? data endscode segmentstart: mov ax,data mov ds,ax mov si,0 clc mov cx,2 s:mov ax,word ptr [A+si] adc ax,word ptr [B+si] mov word ptr [C+si],ax inc si inc si loop s clc mov si,0 mov cx,2 s0:mov ax,word ptr [A+si] sbb ax,word ptr [B+si] mov word ptr [D+si],ax inc si inc si loop s0 mov ax,4c00h int 21hcode endsend start

7.编程实现功能两个128位数据相加

assume cs:code;ds:datadata segment a dw 1,2,3,4,5,6,7,8 b dw 8,7,6,5,4,3,2,1 c dw 8 dup(0)data endscode segmentstart: mov ax,datamov ds,axclc ;清除标志位CF的值mov si,14mov cx,8s:mov ax,ds:a[si]adc ax,ds:b[si] ;ax=ax+b[si]+cFmov ds:c[si],axdec sidec si;sub si,2loop s mov ax,4c00H int 21Hcode endsend start

8.在数据段内连续存放着10个字节型无符号二进制数,编写一段程序,求出该10个数之和,并将结果存放在寄存器AX中。

assume cs:code,ds:datadata segment A db 1B,10B,11B,110B,111B,101B,100B,1111B,1110B,1000Bdata endscode segmentstart: mov ax,data mov ds,ax mov ax,0 mov si,0 clc mov cx,10 s:adc al,byte ptr [A+si] inc si loop s mov ax,4c00H int 21Hcode endsend start

2021/11/16

1.统计分数

assume cs:code,ds:datadata segmentFenshu db 80,45,60,77,88,99,58 a db 0 B db 0data endscode segment start:mov ax,datamov ds,axmov bx,0mov cx,7 s:cmp byte ptr[bx],60jb next;小于60转移到nextinc a;a=5jmp lastnext:inc B jmp lastlast:inc bx loop smov ax,4c00Hint 21Hcode endsend start 编写一个程序,将包含任意字符,以0结尾的字符串的小写字母转变成大写字母。 assume cs:code,ds:datadata segment db "Today is a good day 0"data endscode segmentstart:mov ax,datamov ds,axmov bx,0 s1:cmp byte ptr[bx],'0'je last s2:cmp byte ptr[bx],'a'jb s5 s3:cmp byte ptr[bx],'z'ja s5 s4:sub byte ptr[bx],20H s5:inc bxjmp s1last:mov ax,4c00Hint 21Hcode endsend start

3.编写程序实现以下功能:字变量X与字变量Y比较大小(无符号数),如果大于则字变量z值为1;如果等于,则z值为0;小于则z为-1。

assume cs:code,ds:datadata segment x dw 5 y dw 7 z dw 0data endscode segmentstart:mov ax,datamov ds,axmov ax,xmov bx,ys1:cmp ax,bx;不低于就转移jnb s2amov z,-1jmp lasts2:cmp ax,bx;不deng就转移jne s3mov z,0jmp lasts3:cmp ax,bxmov z,1jmp lastlast:mov ax,4c00Hint 21Hcode endsend start

2021/11/23

假如变量定义如下:
A DB 5,7,15
SUM DW ?,?,?
请编程实现分别求1+2+……+N(N的值分别从A中取),求和值放入到SUM中,其中求和过程用子程序实现。 assume cs:code,ds:datadata segment A db 5,7,15 sum dw ?,?,?data endscode segmentstart: mov ax,datamov ds,axmov si,0mov di,0mov cx,3 s: mov ax,0mov bx,0call kalamov sum[di],axadd di,2 inc siloop smov ax,4c00Hint 21Hkala:clcadc ax,bxinc bxcmp bL,A[si]jna kalaretcode endsend start

2.将数据段中定义的两位数据以十进制的形式分别保存到字符串变量CHAR1、CHAR2、CHAR3中。其中进制转串用子程序实现。
DATA SEGMENT
A DB 12,34,56
CHAR1 DW 2DUP(?)
CHAR2 DW 2DUP(?)
CHAR3DW 2DUP(?)
DATA ENDS

assume cs:code,ds:datadata segment a db 12,34,56 char1 dw 2 dup(0) char2 dw 2 dup(0) char3 dw 2 dup(0)data endscode segmentstart:mov ax,data mov ds,ax mov si,0 mov di,0mov bl,10mov cx,3 s: call dididi mov char1[di],ax inc si add di,2 loop s mov ax,4c00h int 21hdididi:mov al,[si] mov ah,0 div bl ret code ends end start

3.请编写完整程序实现以下功能:设DAT单元存放一个0-9的字节数据,在sqrtab数据区存放了0-9的平方值,实现在sqrtab中查出DAT单元中数据的平方值,然后送入SQR单元,其中查表的方法用子程序实现
DAT DB 8
SQRTAB DB 0,1,4,9,16,25,36,49,64,81
SQR DB ?

assume cs:code,ds:datadata segmentdat db 8sqrtab db 0,1,4,8,16,25,36,49,64,81sqr db ?data endscode segmentstart:mov ax,datamov ds,axs:mov al,datmov ah,0mov si,0mov si,axcall mmmov sqr,alloop smov ax,4C00Hint 21Hmm:mul datcmp al,sqrtab[si]jne mm;不等于就转移retcode endsend start


2021/12/14
编程输入一个字符串,将其原样输出

assume cs:code,ds:datadata segmentchar1 db 11,0,11 dup(0)char2 db 0AH,'$'data endscode segemntstart:mov ax,data mov ds,ax lea dx,char1[1];指定入口参数 mov ah,0AH;从键盘读入一个字符串 int 21H;入口参数DS:DX mov bl,char1[1] mov bh,0 mov char1[bx+2],'$' lea dx,char2 mov ah,09H int 21H;OAH换行,0DH回车 lea dx,char1 add dx,2 mov ah,09H int 21H mov ax,4C00H int 21Hcode endsend start

也有一种简单的写法,如下
不过这种写法比较笼统,没有考虑到输入的字符串与定义的字符串长度不一致的情况

assume cs:code,ds:datadata segmentchar db 11,0,11 dup(0),'$'data endscode segmentstart: mov ah,0AHlea dx,charint 21Hadd dx,2mov ah,09Hint 21Hmov ax,4c00Hint 21Hcode endsend start

持续更新中~~

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。