S01开始

S01开始


#include <iostream>
int main()
{
    std::cout << "Enter two numbers:" << std::endl;
    int v1 = 0, v2 = 0;
    std::cout << "The sum of " << v1 << " and " << v2
                     << " is " << v1 + v2 << std::endl;
    return 0;
}

1、标准库定义了4个IO对象
(1)cin,istream类型的对象,标准输入
(2)cout,ostream类型的对象,标准输出
(3)cerr,ostream类型的对象,标准错误,通常不缓冲
(4)clog,ostream类型的对象,标准错误,输出运行时的一般信息,通常缓冲

注意:在代码中不要混合使用cout/cin和printf/scanf

2、endl:操纵符,写入endl的效果是结束当前行(换行)并将与设备关联的缓冲区中的内容刷到设备中,缓冲区刷新可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入流
3、std:命名空间,可以用于避免不经意间的名字冲突及使用库中相同名字导致的冲突,标准库定义的所有名字都在命名空间std中
4、:::作用域运算符,指出我们想使用定义在哪个命名空间中的名字
5、>>/<<:输入/输出运算符
6、while(cin >> value){} 当输入EOF时条件为假,注意虽然EOF一般定义为-1,但是cin取到EOF时istream对象的状态会变为无效,则条件就为假,前式并不等价于while(EOF),具体关于IO对象的状态参考S08IO库

注意:win10中powershell启用后,不通过”echo %errorlevel%”而是”$lastexitcode”来获得程序执行的返回值

### 数据段定义与数值准备 在汇编语言中,可以通过 `call` 和 `ret` 指令实现子程序调用,从而将数据段中的数值以指定格式输出。首先需要在数据段中定义待显示的数值列表,并为每个数值预留显示缓冲区地址或堆栈空间用于参数传递。 ```asm data segment s01 db 123, 12478, 9, 38 ; 待显示的数值列表 buffer db 10 dup(0) ; 转换后字符串的存储空间 data ends ``` 上述代码中,`s01` 是一个字节数组,包含四个数值:123、12478、9 和 38。这些数值将分别被转换为十进制和十六进制形式并输出到屏幕。 ### 子程序设计与参数传递 为了实现通用的数值输出功能,可以编写两个子程序:一个用于将数值转换为十进制字符串,另一个用于转换为十六进制字符串。这两个子程序均通过 `call` 指令调用,并通过寄存器传递参数,如数值本身、目标缓冲区地址等。 ```asm ; 子程序:将AL中的值转换为十进制字符串,结果保存在DI指向的缓冲区 dec_to_str: mov cx, 0 ; 计数器清零 mov bl, 10 ; 除数设为10 .next_digit: div bl ; AL = AL / 10, AH = AL % 10 push ax ; 保存余数(当前位数字) inc cx ; 位数计数加一 test al, al ; 判断商是否为0 jnz .next_digit ; 若非0,继续处理下一位 .write_digits: pop ax ; 弹出栈顶数字 add al, '0' ; 转换为ASCII字符 stosb ; 存入目标缓冲区 loop .write_digits ret ; 返回主程序 ``` 该子程序使用 `div` 指令进行除法运算,每次取出个位数并压栈,最后依次弹栈写入缓冲区[^1]。类似地,可以编写十六进制转换子程序,其主要区别在于除数为 16,并且对大于 9 的数字需额外处理为 `'A'`~`'F'`。 ### 主程序结构与子程序调用 主程序负责遍历数据段中的每个数值,依次调用十进制和十六进制转换子程序,并将结果输出到屏幕。由于 x86 实模式下的显示缓冲区位于 `B800:0000` 开始的位置,可以直接向该区域写入字符和属性值来更新屏幕内容。 ```asm code segment assume cs:code, ds:data start: mov ax, data mov ds, ax mov si, offset s01 ; SI指向数据起始位置 mov di, 0 ; DI指向显示缓冲区起始位置 mov es, 0B800h ; ES指向显示缓冲区段地址 mov cx, 4 ; 共4个数值 .loop_values: lodsb ; 从数据段加载一个字节到AL call dec_to_str ; 调用十进制转换子程序 ; 此处省略具体显示逻辑,假设已将字符串写入buffer ; 将buffer中的字符串复制到es:[di]开始的位置 mov bx, offset buffer .copy_char: mov al, [bx] test al, al ; 检查是否到达字符串结尾 jz .hex_conversion ; 若是,跳转至十六进制转换 mov es:[di], al ; 写入字符 inc di ; 更新偏移地址 inc bx ; 移动至下一个字符 jmp .copy_char .hex_conversion: ; 类似地调用hex_to_str子程序并显示 loop .loop_values mov ax, 4C00h ; 程序结束 int 21h code ends end start ``` 主程序中使用 `lodsb` 从 `s01` 中依次读取数值,并调用 `dec_to_str` 进行转换。转换后的字符串被写入 `buffer`,随后逐个字符复制到显示缓冲区中。完成十进制输出后,再调用十六进制转换子程序以显示相同数值的不同表示形式。 ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值