Intel8086处理器使用NASM汇编语言实现操作系统04-实模式-屏幕显示不定长度的字符串(cmp/je)

本示例遇到的新汇编指令cmp,je
cmp正确写法

cmp eax,666			;用eax里的值减去666,如果值为0,则将ZR(ZF)标志位=1
					;如果发生借位或进位,CF(CY)标志位=1
					;如果溢出,则OF(OV)标志位=1
cmp eax,ebx
cmp byte [123], 123

cmp错误写法

cmp 123,123							;操作数不可以都是立即数
cmp [0x7c00],[0x7c01]				;操作数不可以都是内存地址
cmp [0x7c00], 666					;操作数不知道有多长

je正确写法

;标号跳转
there:
cmp byte [si], 0x01					;不要忘记了si默认使用ds段寄存器
je there							;如果ZF=1,则跳转到there标号处执行
;寄存器跳转
je eax								;直接跳转到物理地址,与段寄存器无关

本文演示定义一个字符串,然后循环取出字符串的每个字符,依次放到显存(0xb8000开始)中

mov ax,0xb800						;设置ds/si组合,表示显存的段和偏移
mov ds,ax
mov si,0x0

mov ax,0x7c0						;设置es/bx组合,用来表示字符串
mov es,ax

mov bx,string						;bx是字符串起始地址

print:

mov dl,[es:bx]						;将bx地址中的字符串放到dl中
cmp dl,0							;判断字符串内容是否是0
je do_not_stop						;如果0就结束,直接跳走了,否则就将内容显示到屏幕上
mov byte [si],dl					
inc si
mov byte [si],0bH
inc si
inc bx
jmp print
string db 'Hello World!!I Love Rabbit'
stringend db 0x00
do_not_stop:jmp do_not_stop			;执行无限循环
times 510-($-$$) db 0h

dw 0AA55H
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 x86 汇编语言实现从键盘输入小写字符串输出对应的大写字符串的程序: ```assembly section .data prompt db "Please enter a string: ", 0 output db "The uppercase string is: ", 0 buffer db 256 ; 输入缓冲区大小 section .bss input resb 256 ; 输入字符串 upper resb 256 ; 转换后的大写字符串 section .text global _start _start: ; 输出提示信息 mov eax, 4 ; 4 表示 sys_write 系统调用 mov ebx, 1 ; 1 表示标准输出 mov ecx, prompt ; 存放要输出字符串的地址 mov edx, 19 ; 存放要输出字符串长度 int 0x80 ; 调用系统调用 ; 读取输入字符串 mov eax, 3 ; 3 表示 sys_read 系统调用 mov ebx, 0 ; 0 表示标准输入 mov ecx, input ; 存放输入字符串的地址 mov edx, buffer ; 存放输入缓冲区的大小 int 0x80 ; 调用系统调用 ; 转换为大写字符串 mov esi, input ; 存放输入字符串的地址 mov edi, upper ; 存放转换后的大写字符串的地址 mov ecx, 0 ; 存放字符串长度 convert_loop: cmp byte [esi], 0 ; 检查字符串是否结束 je convert_done ; 如果结束则跳转到 convert_done cmp byte [esi], 'a' ; 检查字符是否是小写字母 jb convert_next ; 如果不是小写字母则跳转到 convert_next cmp byte [esi], 'z' ja convert_next sub byte [esi], 32 ; 将小写字母转换为大写字母 convert_next: mov byte [edi], [esi] ; 将字符复制到转换后的字符串中 inc esi ; 增加输入字符串指针 inc edi ; 增加转换后的字符串指针 inc ecx ; 增加字符串长度 jmp convert_loop ; 跳转到 convert_loop convert_done: mov byte [edi], 0 ; 在转换后的字符串末尾加上结束符号 ; 输出转换后的大写字符串 mov eax, 4 ; 4 表示 sys_write 系统调用 mov ebx, 1 ; 1 表示标准输出 mov ecx, output ; 存放要输出字符串的地址 mov edx, 25 ; 存放要输出字符串长度 int 0x80 ; 调用系统调用 mov eax, 4 ; 4 表示 sys_write 系统调用 mov ebx, 1 ; 1 表示标准输出 mov ecx, upper ; 存放转换后的大写字符串的地址 mov edx, ecx ; 存放转换后的大写字符串长度 int 0x80 ; 调用系统调用 ; 退出程序 mov eax, 1 ; 1 表示 sys_exit 系统调用 xor ebx, ebx ; 返回值为 0 int 0x80 ; 调用系统调用 ``` 在 Linux 上可以使用 nasm 编译器将上述代码编译成可执行文件: ```bash nasm -f elf32 -o program.o program.asm ld -m elf_i386 -o program program.o ``` 然后运行可执行文件即可看到程序的运行结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值