记录学习汇编过程中遇到的有趣的习题
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 start7.编程实现功能两个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 start8.在数据段内连续存放着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 start2021/11/16
1.统计分数
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 start2021/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
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 ?
2021/12/14
编程输入一个字符串,将其原样输出
也有一种简单的写法,如下
不过这种写法比较笼统,没有考虑到输入的字符串与定义的字符串长度不一致的情况
持续更新中~~