![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
汇编语言
X-jazz
任生命如烟火般绽放于夜空,似絮梦流过人间。
展开
-
编写一个程序段,在DX高4位全为0时,使AX=0,否则使AX=-1
;编写一个程序段,在DX高4位全为0时,使AX=0,否则使AX=-1assume cs:codecode segmentstart: mov ax, 0 mov dh, 00000001b cmp DH, 00000000b jz z mov ax, -1 z:push ax mov ax, 0 pop ax mov ax, 4c00H int 21H...原创 2020-04-10 10:04:54 · 777 阅读 · 0 评论 -
用移位指令实现al乘10(带进位)
;用移位指令实现al乘10;思路:先用二进制移位指令实现乘8,再加两次自己就是乘10assume cs:codecode segmentstart: xor ah,ah ;先将ah清空,因为要算al乘10带进位,ah要留出来给可能发生的进位 mov bx,ax mov cl,3 shl ax,cl ;二进制数左移三位相当于乘8 add ax,bx ...原创 2020-04-10 10:03:19 · 2291 阅读 · 0 评论 -
实现把bl中的8位数高低4位互换
;实现把bl中的8位数高低4位互换assume cs:codecode segmentstart: mov bl, 11110001B mov cl, 4 ror bl, cl ;bl中的值右移4位,bl=0000'1111B mov dl, bl ;将bl中的值预存给dl,以保护现场,dl=bl=0000'1111B mov cl, 4 ;cl=4 SHR bl, cl...原创 2020-04-10 10:02:33 · 1435 阅读 · 1 评论 -
用移位指令实现al乘10(不带进位)
;用移位指令实现al乘10(不带进位);思路:乘法本质其实是加法,先利用二进制的位移指令进行一次乘8再加两次自己。assume cs:codecode segmentstart: mov bl,al mov cl,3 shl al,cl ;左移三位,相当于*8 add al,bl ;已经乘过8了...原创 2020-04-10 10:01:12 · 2265 阅读 · 0 评论 -
用串传送指令,将F000H段中的最后16个字符复制到data段中。
;用串传送指令,将F000H段中的最后16个字符复制到data段中。;思路:将ds:si指向F000H段的最后一个单元,将es:di指向data段中的最后一个单元,;将es:di指向data段中的最后一个单元,然后逆向(即从高地址向低地址)传送16个字节即可。assume cs:codedata segment db 16 dup (0)data endscode segment...原创 2020-04-10 09:59:43 · 652 阅读 · 0 评论 -
用cld和rep movsb以字节传送数据
assume cs:codedata segment db 'Welcome to masm!' db 16 dup (0)data endscode segmentstart: mov ax, data mov ds, ax mov si, 0 ;ds:si指向data:0 mov es, ax mov di, 16 ;es:di指向data:16 mov...原创 2020-04-10 09:58:16 · 497 阅读 · 1 评论 -
统计data段中数值为8的字节的个数,用ax保存统计结果
;统计data段中数值为8的字节的个数,用ax保存统计结果assume cs:code, ds:datadata segment db 8,11,8,1,8,5,63,38data endscode segmentstart: mov ax, data mov ds, ax mov bx, 0 ;ds:bx指向第一个字节 mov ax, 0 ;初始化累加器 ...原创 2020-04-10 09:56:03 · 1653 阅读 · 1 评论 -
实现:如果(ah)=(bh)则(ah)=(ah)+(ah),否则(ah)=(ah)+(bh)
;如果(ah)=(bh)则(ah)=(ah)+(ah),否则(ah)=(ah)+(bh)assume cs:codecode segmentstart: cmp ah, bh je s ;je : jmp equal,如果相等就跳转 add ah, bh jmp short ok s:add ah, ah ok:ret mov ax, 4C00H int...原创 2020-04-10 09:54:08 · 298 阅读 · 0 评论 -
编程测试CX为0时的循环次数
assume cs:codecode segmentstart: mov ax, 0000H mov bx, 0000H mov cx, 0 s:add bx, 1 adc ax, 0000H loop s mov ax, 4c00H int 21Hcode endsend start原创 2020-04-10 09:52:47 · 806 阅读 · 0 评论 -
编写一个子程序,对两个128位数据进行相加
;编写一个子程序,对两个128位数据进行相加assume cs:code, ds:datadata segment db 88H,88H,88H,88H,88H,88H,88H,88H,88H,88H,88H,88H,88H,88H,88H,88H db 11H,11H,11H,11H,11H,11H,11H,11H,11H,11H,11H,11H,11H,11H,11H,11Hda...原创 2020-04-10 09:51:01 · 1357 阅读 · 0 评论 -
编程计算1EF000H+201000H,结果放在ax(高16位)和bx(低16位)中。
;编程计算1EF000H+201000H,结果放在ax(高16位)和bx(低16位)中。assume cs:codecode segmentstart: mov ax, 001EH mov bx, 0F000H add bx, 1000H ;发生进位,CF标志位置1 adc ax, 0020H ;由于低16位相加时发生进位,所以高16位用adc指令相加 mov ax,...原创 2020-04-10 09:50:24 · 743 阅读 · 0 评论 -
将16进制数转化为10进制并在屏幕上显示出来
;将16进制数转化为10进制并在屏幕上显示出来assume cs:code,ds:datadata segment db 10 dup (0)data endscode segmentstart: mov ax, 12666 mov bx, data mov ds, bx mov si, 0 ;ds:si指向字符串的首地址 call dtoc...原创 2020-04-10 09:47:26 · 2523 阅读 · 0 评论 -
在指定的位置,用指定的颜色,显示一个用0结束的字符串
;在指定的位置,用指定的颜色,显示一个用0结束的字符串;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),;(cl)=颜色,ds:si指向字符串的首地址;应用举例:在屏幕的8行3列,用绿色显示data段中的字符串assume cs:code, ds:datadata segment db 'Welcome to masm!', 0 data...原创 2020-04-10 09:41:31 · 353 阅读 · 0 评论 -
用call、ret指令实现将以0结尾的c字符串转大写
assume cs:code, ss:stackdata segment db 'word', 0 db 'unix', 0 db 'wind', 0 db 'good', 0data endsstack segmentdw 0,0,0,0,0,0,0,0stack endscode segmentstart: mov ax, stack mov ss, ax ...原创 2020-04-10 09:37:19 · 156 阅读 · 0 评论 -
利用call、ret指令实现小写单词转大写
assume cs:codedata segment db 'conversation'data endscode segmentstart: mov ax, data mov ds, ax mov si, 0 ;ds:si指向字符串(批量数据)所在空间的首地址 mov cx, 12 ;cx存放字符串的长度 call capital mov a...原创 2020-04-10 09:31:05 · 155 阅读 · 0 评论 -
利用call,ret指令计算数据的立方
assume cs:codedata segmentdw 1,2,3,4,5,6,7,8dd 0,0,0,0,0,0,0,0data endscode segmentstart: mov ax, data mov ds, ax mov si, 0 ;ds:si指向第一组word单元 mov di, 16 ;ds:di指向第二组dword单元 mov cx...原创 2020-04-10 09:28:01 · 180 阅读 · 0 评论 -
汇编语言中dup指令,call、ret指令的使用
一:assume cs:codesgstack segment db 16 dup(0) ;16个0stack endscodesg segment mov ax, 4C00H int 21Hstart: mov ax, stack mov ss, ax mov sp, 16 mov ax, 0 push ax mov bx, 0 ret ;相当于po...原创 2020-04-10 09:27:23 · 2006 阅读 · 0 评论 -
在汇编语言中用不同颜色显示同一字符串
assume cs:code,ds:data,ss:stackdata segment db 'welcome to masm!' ;定义要显示的字符串 db 02h,24h,71h ;定义三种颜色属性 ; 7 6 5 4 3 2 1 0 ;颜色属性:BL R G B I R G B ; 闪 背景 亮 前景 ;比如红底...原创 2020-04-10 09:15:06 · 1698 阅读 · 0 评论 -
利用跳转语句本质编写的一段代码
assume cs:codesgcodesg segment mov ax, 4c00H int 21Hstart: mov ax, 0s: nop nop mov di, offset s ;将s处的ip赋值给di mov si, offset s2 ;将s2处的ip赋值给si mov ax, cs:[si] ;相当于将s2处的物理地址给ax寄...原创 2020-04-10 09:13:25 · 93 阅读 · 0 评论 -
8086下32位除法
assume cs:codesg, ds:datasgdatasg segment dd 100001 dw 100 dw 0datasg endscodesg segmentstart: mov ax, datasg mov ds, ax ; mov ax, ds:[0] mov dx, ds:[2] div word ptr ds:[4] mov ds:[6]...原创 2020-04-10 09:12:10 · 858 阅读 · 1 评论 -
利用二重循环将数据段中每行字母改为大写
;将数据段中每行字母改为大写assume cs:codesg, ds:datasg, ss:stacksgdatasg segmentdb 'ibm 'db 'dec 'db 'dos 'db 'vax 'dw 0 ;定义一个字,用来保存cxdatasg endsstack...原创 2020-04-09 16:35:37 · 164 阅读 · 0 评论 -
汇编语言大小写转化
assume cs:codesg, ds:datasgdatasg segmentdb 'BaSic'db 'iNfOrMaTiOn'datasg endscodesg segmentstart: mov ax, datasg mov ds, ax mov bx, 0 mov cx, 5 s:mov al, [bx] and al, 11011111B ;将al...原创 2020-04-09 16:31:38 · 452 阅读 · 0 评论 -
汇编语言栈操作
assume cs:code, ds:data, ss:stackdata segment dw 0000H, 0002H, 0002H, 0004H, 0008H, 0001H, 0100H, 1000Hdata endsstack segment dw 0, 0, 0, 0, 0, 0, 0, 0stack endscode segmentstart: mov ax, s...原创 2020-04-09 16:30:55 · 404 阅读 · 0 评论 -
汇编语言中逻辑运算符
逻辑运算符包括:逻辑乘(AND)、逻辑加(OR)、 按位加(XOR)、逻辑非(NOT)、 )、SHL(左 移)、SHR(右移)运算。 例如:❖ MOV AL,34H AND 0FH ;04H→AL❖ MOV BL,05H OR 30H ;35H→BL❖ MOV CX,NOT 00FFH ;0FF00H→CX❖ MOV DX,789AH XOR 000FH ;7895H→DX...原创 2020-04-09 10:26:30 · 3162 阅读 · 1 评论 -
movsb movsw movsd 指令详解
movsb movsw movsd 指令详解这三个指令,都是数据传送指令,都是从源地址向目的地址传送数据。16位模式下:源地址是DS:SI,目的地址是ES:DI32位模式下:源地址是DS:ESI,目的地址是ES:EDI注意:在传送完成之后,SI和DI(或者ESI和EDI)会增加或者减小。当DF=0 时,表示正向传送,传送之后SI和DI(或者ESI和EDI)的值会增加;当DF=1 时...转载 2020-04-07 11:36:48 · 1843 阅读 · 0 评论 -
显示BX的最高位
;显示BX的最高位assume cs:codecode segmentstart: shl bx, 1 ;BX最高位移入CF jnc one ;CF=0,即最高位为0,转移 mov dl, '1' ;CF=1,即最高位为1,DL<-'1' jmp two ;一定要跳过另一个分支体one:mov dl, '0' ;DL<-'0'two:mov ah, 2...原创 2020-04-07 10:18:42 · 674 阅读 · 0 评论 -
计算AX的绝对值
;计算AX的绝对值 cmp ax, 0 jns nonneg ;分支条件:AX>=0 neg ax ;条件不满足,求补nonneg: mov result, ax ;条件满足原创 2020-04-07 09:59:07 · 872 阅读 · 0 评论 -
从键盘读入一个2位的十进制的正整数,存入BL中
;从键盘读入一个2位的十进制的正整数,存入BL中。assume cs:codecode segmentstart:MOV AH,1INT 21H ;等待输入十位AND AL,0FH ;取数MOV BL,10MUL BL ;乘以10MOV BL,AL ;暂存MOV AH,1 ...原创 2020-04-07 09:54:33 · 383 阅读 · 0 评论 -
字型数据dw
assume cs:codecode segment dw 0000H, 0002H, 0002H, 0004H, 0008H, 0001H, 0100H, 1000H ;dw定义字类型变量,一个字数据占2个字节单元,读完一个,偏移量加2 start: mov bx, 0 ;bx=0 mov ax, 0 ;ax=0 mov cx, 8 ;循环8次 s:add ...原创 2020-04-02 11:05:28 · 538 阅读 · 0 评论 -
cx控制循环加偏移地址赋值写的两段程序
assume cs:codecode segment mov ax, 0ffffh mov ds, ax mov bx, 0 mov dx, 0 mov cx, 12 s: mov al, [bx] ;将ffff:0000处的值赋给al mov ah, 0 ;ah置0 add dx, ax ;dx+=ax inc bx ;bx++ loop s ;最终实现的是将...原创 2020-04-02 10:48:24 · 334 阅读 · 0 评论 -
段地址加偏移地址赋值
assume cs:codecode segment mov ax, 2000H mov ds, ax mov bx, 0 mov ax, 1 mov [bx], ax ;把2000:0000处的值赋值为1 mov al, [bx] ;把2000:0000处的值赋值给al mov bx, 1 ;bx=1 mov ax, 2 mov [bx], ax ;把2000:0001处的...原创 2020-04-02 10:40:35 · 733 阅读 · 0 评论 -
CX控制loop循环
assume cs:codecode segment mov ax, 0ffffh mov ds, ax mov bx, 6 ;立即数赋值,就是简单赋一个数 mov al, [bx] ;把ds:0006处的值赋值给al mov ah, 0 mov dx, 0 mov cx, 3s: add dx, ax ;把ax处的值循环加三次存储在dx中 loop s mov ...原创 2020-04-02 09:15:38 · 1172 阅读 · 0 评论 -
编写一个程序段,在DX高4位全为0时,使AX=0,否则使AX=-1
;编写一个程序段,在DX高4位全为0时,使AX=0,否则使AX=-1assume cs:codecode segmentstart: mov ax, 0 mov dh, 00000001b cmp DH, 00000000b jz z mov ax, -1 z:push ax mov ax, 0 pop ax mov ax, 4c00H int 21H...原创 2020-03-29 10:56:21 · 1238 阅读 · 0 评论 -
把DX,AX中的双字右移四位
;把DX,AX中的双字右移四位。assume cs:codecode segmentstart: MOV DX, 0FFFFH MOV CL, 4 ;设置循环次数为4 SHR AX, CL ;实现将AX逻辑右移 MOV BL, DL ;将DL的低4位暂存在BL中 SHR DX, CL ;实现将DX逻辑右移 SHL BL, CL ;将BL逻辑左移 OR AH, BL ;将BL...原创 2020-03-29 00:01:28 · 6069 阅读 · 2 评论 -
用移位指令实现al乘10(带进位)
;用移位指令实现al乘10(带进位);思路:先用二进制移位指令实现乘8,再加两次自己就是乘10assume cs:codecode segmentstart: xor ah,ah ;先将ah清空,因为要算al乘10带进位,ah要留出来给可能发生的进位 mov bx,ax mov cl,3 shl ax,cl ;二进制数左移三位相当于乘8 add ax,bx ...原创 2020-03-28 22:43:45 · 3100 阅读 · 2 评论 -
用移位指令实现al乘10(不带进位)
;用移位指令实现al乘10(不带进位);思路:乘法本质其实是加法,先利用二进制的位移指令进行一次乘8再加两次自己。assume cs:codecode segmentstart: mov bl,al mov cl,3 shl al,cl ;左移三位,相当于*8 add al,bl ;已经乘过8了...原创 2020-03-28 22:20:54 · 4042 阅读 · 0 评论 -
汇编语言loop循环
assume cs:codecode segment mov ax, 2 ;ax=2 mov cx, 11 ;将cx赋值为11, ;CX一大功能用作汇编语言loop循环次数的存储器, ;loop循环每执行一次CX中存储的数值减一,循环结束的标准是CX为零 ;所以要用loop循环,要提前给CX赋值,CX中存的数字就是你要执行的循环次数s: add ax, ax ;s...原创 2020-03-28 11:39:38 · 9075 阅读 · 0 评论 -
8086物理地址、汇编自增指令inc
assume cs:codesgcodesg segmentxjazz: mov ax, 2000H ;ax=2000H mov ds, ax ;ds=ax=2000H mov bx, 1000H ;bx=1000H mov ax, [bx] ;将偏移地址1000处存储的数据赋值给AX ;即将物理地址ds:1000处(即2000:1000处)存储的值给AX ...原创 2020-03-28 11:28:34 · 7041 阅读 · 0 评论 -
汇编语言给低位寄存器或高位寄存器赋值1
assume cs:codesgcodesg segmentxjazz: mov ax, 2000H ;ax=2000H mov ds, ax ;ds=ax=2000H mov al, [0] ;al=00 mov bl, [1] ;bl=01 mov cl, [2] ;cl=02 mov dl, [3] ;dl=03 mov ax, 4C00H ...原创 2020-03-28 11:01:33 · 3161 阅读 · 0 评论 -
汇编语言实现计算2的3次方
assume cs:abcabc segment mov ax, 2 ;ax=2 add ax, ax ;ax+=ax=4 add ax, ax ;ax+=ax=8 mov ax, 4c00H int 21Habc endsend思路就是先把2赋值给AX寄存器,再执行两次AX自加原创 2020-03-27 23:28:22 · 3352 阅读 · 0 评论