- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,这是一个家庭作业。
我有一个循环来分别获取两位数的值,并通过将第一个数字乘以 10 并与第二个数字相加得到一个整数来加入它们。
我正在做这一切并保存在我的AL
注册,现在我想将该整数插入一个数组,然后扫描该数组并显示这些数字。
如何插入向量并从向量中读取?
我的数组:
section .bss
array resb 200
sub byte[digit_une], 30h
sub byte[digit_two], 30h
mov al, byte[digit_one]
mov dl, 10 ;dl = 10
mul dl ;al = ax = 10 * digit_one
add al, byte[digit_two] ;al = al + digit_two = digit_one * 10 + digit_two
最佳答案
“数组”、“向量”等......所有这些都是更高层次的概念。机器有内存,可以通过单字节寻址,你用你的代码实现什么样的逻辑,这取决于你。但是您应该能够在两个级别上考虑它,作为内存中的单个字节,每个字节都有自己的地址,并完全理解您的代码逻辑,它将如何安排这些字节的使用以形成“某些东西的数组”。
通过定义 .bss
扇区,您定义了一个符号/标签 array
,它等于 .bss
段开始的内存地址。然后您保留 200 字节的空间,因此您将添加的任何其他内容(如另一个标签)将从地址 .bss+200
开始。
假设(例如)在将二进制文件加载到内存并跳转到入口点之后, .bss 位于地址 0x1000
。
然后
mov dword [array],0x12345678
0x1000 .. 0x1003
处将 4 个字节存储到内存中,其中特定字节具有值
78 56 34 12
(该 dword 值的小端分解)。
mov dword [array+199],0x12345678
,您将通过该
0x78
将值
resb 200
写入最后一个官方保留的字节,剩余的 3 个字节将覆盖地址 .bss+200、.bss+201 和 .bss+202 处的内存(可能会损坏其他一些数据,如果您将某些东西放在那里,或者使您的应用程序崩溃,如果它会跨越内存页面边界,并且您处于进程可用内存的末尾)。
array+0
,第二个值存储在
array+1
等等......(对于
dword 值,最合乎逻辑的方式是
array+0, array+4, array+8, ....
)。
mov [array+0],al
可用于存储第一个值。但这不是很实用,如果您在某种循环中读取输入。假设您想从用户那里读取最多 200 个值,或者值
99
将更快结束,那么您可以使用寄存器索引,例如:
xor esi,esi ; rsi = index = 0
mov ecx,200 ; rcx = 200 (max inputs)
input_loop:
; do input into AL = 0..99 integer (preserve RSI and RCX!)
...
cmp al,99
je input_loop_terminate
mov [array+rsi], al ; store the new value into array
inc rsi ; ++index
dec rcx ; --counter
jnz input_loop ; loop until counter is zero
input_loop_terminate:
; here RSI contains number of inputted values
; and memory from address array contains byte values (w/o the 99)
20 48 0D 00 10 ?? ?? ?? ...
。
array
标签,因此您可能会执行一个子例程,它将(数组的)目标地址和最大计数作为参数:
; function to read user input, rsi = array address, rcx = max count
; does modify many other registers
; returns amount of inputted values in rax
take_some_byte_values_from_user:
jrcxz .error_zero_max_count ; validate count argument
lea rdi,[rsi+rcx] ; rdi = address of first byte beyond buffer
neg rcx ; rcx = -count (!)
; ^ small trick to make counter work also as index
; the index values will be: -200, -199, -198, ...
; and that's perfect for that "address of byte beyond buffer"
.input_loop:
; do input into AL = 0..99 integer (preserve RSI, RDI and RCX!)
...
cmp al,99
je .input_loop_terminate
mov [rdi+rcx], al ; store the new value into array
inc rcx ; ++counter (and index)
jnz .input_loop ; loop until counter is zero
.input_loop_terminate:
; calculate inputted size into RAX
lea rax,[rdi+rcx] ; address beyond last written value
sub rax,rsi ; rax = count of inputted values
ret
.error_zero_max_count:
xor eax,eax ; rax = 0, zero values were read
ret
...
mov rsi,array ; rsi = address of reserved memory for data
mov ecx,200 ; rcx = max values count
call take_some_byte_values_from_user
; keep RAX (array.length = "0..200" value) somewhere
test al,al ; as 200 was max, testing only 8 bits is OK
jz no_input_from_user ; zero values were entered
...
mov [array+4*rsi],eax ; store dword value into "array[rsi]"
add <pointer_reg>, <size_of_element>
一样执行
add rdi,96
移动到下一个元素,以避免每次访问的索引值相乘。
.bss
被 libc 或 OS IIRC 清零?否则可能会有一些垃圾),所以它只是用用户的值覆盖旧的垃圾值。
resb
仍然“保留”了 200 字节的内存,并且您的代码必须跟踪实际大小(输入值的计数)以了解用户输入的结束位置以及垃圾数据的开始位置(或者您最终可能会写入
99
值也进入数组,并将其用作“终止符”值,那么您只需要数组的地址来扫描它的内容,并在找到值
99
时停止)。
关于arrays - 将值插入数组并显示,nasm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47232111/
在 C 中: int a[10]; printf("%p\n", a); printf("%p\n", &a[0]); 产量: 0x7fff5606c600 0x7fff5606c600 这是我所期望
我一直在尝试运行此循环来更改基于数组的元素的位置,但出现以下错误。不太确定哪里出了问题。任何想法或想法!谢谢。 var population = [[98, 8, 45, 34, 56], [9, 1
我正在尝试获取一个 Ruby 数组数组并将其分组以计算其值。 数组有一个月份和一个 bool 值: array = [["June", false], ["June", false], ["June"
所以我们的目标是在遇到某个元素时将数组分割成子数组下面的示例 array.split("stop here") ["haii", "keep", "these in the same array bu
在this问题已经回答了两个表达式是相等的,但在这种情况下它们会产生不同的结果。对于给定的 int[] 分数,为什么会这样: Arrays.stream(scores) .forEac
我认为我需要的是哈希数组的数组,但我不知道如何制作它。 Perl 能做到吗? 如果是这样,代码会是什么样子? 最佳答案 perldoc perldsc是了解 Perl 数据结构的好文档。 关于arra
我遇到了这个问题,从 API 中我得到一个扩展 JSON,其中包含一个名为坐标的对象,该对象是一个包含数组 o 数组的数组。 为了更清楚地看这个例子: "coordinates": [
postgres 中有(v 9.5,如果重要的话): create table json_test( id varchar NOT NULL, data jsonb NOT NULL, PRIM
我用 echo "${array[@]}" 和 echo "${array[*]}" 得到了相同的结果。 如果我这样做: mkdir 假音乐; touch fakemusic/{Beatles,Sto
我正在尝试创建 typealias 对象的数组数组 - 但我收到“表达式类型不明确,没有更多上下文”编译错误。这是我的代码: typealias TestClosure = ((message: St
如果您在 Python 中创建一维数组,使用 NumPy 包有什么好处吗? 最佳答案 这完全取决于您打算如何处理数组。如果您所做的只是创建简单数据类型的数组并进行 I/O,array模块就可以了。 另
当我将数组推送到只有一个数组作为其唯一元素的数组数组时,为什么会得到这种数据结构? use v6; my @d = ( [ 1 .. 3 ] ); @d.push( [ 4 .. 6 ] ); @d.
在 Julia 中,我想将定义为二维数组向量的数据转换为二维矩阵数组。 如下例所述,我想把数据s转换成数据t,但是至今没有成功。 我该如何处理这个案子? julia> s = [[1 2 3], [4
C 没有elementsof 关键字来获取数组的元素数。所以这通常由计算 sizeof(Array)/sizeof(Array[0]) 代替但这需要重复数组变量名。1[&Array] 是指向数组后第一
所以,假设我有一个像这样的(愚蠢的)函数: function doSomething(input: number|string): boolean { if (input === 42 || in
我有以下数组: a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] 我将它用于一些像这样的视觉内容: 1 2 3 4 5 6 7 8 9 10
我想知道数组中的 .toList 与 .to[List] 之间有什么区别。我在spark-shell中做了这个测试,结果没有区别,但我不知道用什么更好。任何意见? scala> val l = Arr
我很难获得完全相同对象的多个元素的当前元素索引: $b = "A","D","B","D","C","E","D","F" $b | ? { $_ -contains "D" } 替代版本: $b =
我正在尝试使用来自我的 API 的 v-select 执行 options,我将数据放在数组数组中。 Array which I got from API 它应该是一个带有搜索的 select,因为它
这个问题在这里已经有了答案: String literals: pointer vs. char array (1 个回答) 4 个月前关闭。 当我执行下一个代码时 int main() {
我是一名优秀的程序员,十分优秀!